關於View的setOnTouchListener和setOnClickListener衝突

如果一個view既有移動又有點擊事件,那麼就會有如下衝突:

setOnTouchListener的onTouch方法中,移動後擡起時

event.getAction()==MotionEvent.ACTION_UP
會觸發setOnClickListener事件。(event.getAction()==MotionEvent.ACTION_DOWN 返回true的則onTouch消費事件,不會響應點擊事件)

要是不想在擡起時響應點擊事件的話,網上有的用反射啊,有的用一個Boolean全局變量記錄是不是移動事件啊等等,其實,只要在

case MotionEvent.ACTION_UP:
判斷是點擊還是移動

    點擊:v.performClick;(自己會去調用點擊事件)

    移動:什麼都不做

setOnTouchListener返回true就好了。


附:

Button的onTouch,onClick,onLongClick事件發生先後順序和關聯:
一,onTouch返回false
首先是onTouch事件的down事件發生,此時,如果長按,觸發onLongClick事件;
然後是onTouch事件的up事件發生,up完畢,最後觸發onClick事件。

二,onTouch返回true
首先是onTouch事件的down事件發生,然後是onTouch事件的up事件發生;期間不觸發onClick和onLongClick事件

三,onTouch:down返回true,up返回false:結果同二。
機制分析:
   onTouch事件中:down事件返回值標記此次事件是否爲點擊事件(返回false,是點擊事件;返回true,不記爲點擊事件),而up事件標記此次事件結束時間,也就是判斷是否爲長按。
只要當down返回true時候,系統將不把本次事件記錄爲點擊事件,也就不會觸發onClick或者onLongClick事件了。因此儘管當up的時候返回false,系統也不會繼續觸發onClick事件了。

四,onTouch:down返回false,up返回true:
首先是onTouch事件的down事件發生,此時:
長按,觸發onLongClick事件,然後是onTouch事件的up事件發生,完畢。
短按,先觸發onTouch的up事件, 到一定時間後,自動觸發onLongClick事件。
機制分析:
  onTouch事件中:down事件返回值標記此次事件是否爲點擊事件(返回false,是點擊事件;返回true,不記爲點擊事件),而up事件標記此次事件結束時間,也就是判斷是否爲長按。
  當down返回false,標記此次事件爲點擊事件,而up返回了true,則表示此次事件一直沒有結束,也就是一直長按下去了,達到長按臨界時間後,自然觸發長按事件,而onClick事件沒有觸發到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章