如果一個view既有移動又有點擊事件,那麼就會有如下衝突:
setOnTouchListener的onTouch方法中,移動後擡起時
event.getAction()==MotionEvent.ACTION_UP
會觸發setOnClickListener事件。(event.getAction()==MotionEvent.ACTION_DOWN 返回true的則onTouch消費事件,不會響應點擊事件)
要是不想在擡起時響應點擊事件的話,網上有的用反射啊,有的用一個Boolean全局變量記錄是不是移動事件啊等等,其實,只要在
case MotionEvent.ACTION_UP:
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事件沒有觸發到。