為自定義的View新增長按事件

2022-03-11 05:11:45 字數 1296 閱讀 8331

以前開發畫板元件時,要新增乙個長按監聽事件,這個畫板實際上就是繼承自view的乙個自定義元件。

首先,設定好長按事件發生時要觸發的操作:

private

class longpressrunnable implements

runnable

@override

public

void

run()

}

接下來,編寫自定義的view,重點在覆寫dispatchtouchevent(motionevent)方法:

public

class myview extends

view

}return

true

; }

private

void postcheckforlongtouch(float x, float

y) }

原理很簡單,長按事件的本質是:手指觸控某個點保持不移動,也就是touch的時候僅僅發生action_down事件,不發生action_move和action_up事件,這樣經過一定時間(這裡是500毫秒)則成功觸發長按事件。

所以乙個長按事件的週期是on touch down ---> 500ms ---> on long press。

接下來分析上面的實現:當我們收到touch事件時,不管是什麼事件,先刪除上一次設定好的longpressrunnable,

removecallbacks(longpressrunnable);

這意味著上一次觸控週期沒有觸發長按操作。

if (event.getaction() == motionevent.action_down && event.getpointercount() == 1)

private

void postcheckforlongtouch(float x, float

y)

如果在這500毫秒內,使用者的手指沒有移動或抬起,也就是不會有任何touch事件到來,則該longpressrunnable會在500毫秒後執行,乙個長按操作就完成了。

如果在這500毫秒內使用者的手指移動或抬起了,那麼新的touch事件到來,longpressrunnable也會被移除。

以上就是整個實現,這個實現有個需要優化的地方,就是//todo那裡,由於人的手指並沒有那麼精細,在長按過程中可能會有一點移動,這往往會導致長按失敗,所以我們可以在//todo那裡新增對action_move事件的處理,忽略一些細微的移動事件,留給讀者自行實現吧:d

Android自定義長按事件

android系統自帶了長按事件,setonlongclicklistener即可監聽。但是有時候,你不希望用系統的長按事件,比如當希望長按的時間更長一點的時候。這時候就需要自己來定義這個長按事件了。packagechroya.fun importandroid.content.context im...

為C 自定義控制項新增自定義事件

大氣象 原文 為c 自定義控制項新增自定義事件 這裡的自定義控制項是由普通控制項組合而成的。希望事件響應 推遲到使用自定義控制項的窗體裡寫。步驟一 新建乙個使用者控制項,放兩個按鈕,tag分別是btn1,btn2.這兩個按鈕的共用單擊事件處理 如下 using system using system...

為C 自定義控制項新增自定義事件

大氣象 原文 為c 自定義控制項新增自定義事件 這裡的自定義控制項是由普通控制項組合而成的。希望事件響應 推遲到使用自定義控制項的窗體裡寫。步驟一 新建乙個使用者控制項,放兩個按鈕,tag分別是btn1,btn2.這兩個按鈕的共用單擊事件處理 如下 using system using system...