尊重原創,本文轉自:https://blog.csdn.net/qq_23934247/article/details/88711079
今天在做一個錄音的功能,按下開始錄音,放開結束錄音。完美的實現了,還測試了一兩臺手機,打算攻下個功能點去做了的。結果,好死不死,用了我自己的小米note3的手機也測了下錄音,結果????為什么明明放開了,還沒有結束錄音???還需要再次按下才能結束錄音,當時那個心吶,痛的我。還特意去測試那找了小米5的手機來測,但是人家還是好好的,正常按下放開。一點毛病都沒,那會心就更痛了。怎么只有我的手機才出現這個問題,開始以為是傳送門的問題,把傳送門關了后還是一樣,結果就找啊找啊,眼淚都掉下來了,終于找到了!。
原來,MotionEvent.ACTION_UP沒有執行啊,執行的是MotionEvent.ACTION_CANCEL事件!!!
原因是:
當控件收到前驅事件(什么叫前驅事件?一個從DOWN一直到UP的所有事件組合稱為完整的手勢,中間的任意一次事件對于下一個事件而言就是它的前驅事件)之后,后面的事件如果被父控件攔截,那么當前控件就會收到一個CANCEL事件,并且把這個事件會傳遞給它的子事件。(注意:這里如果在控件的onInterceptTouchEvent中攔截掉CANCEL事件是無效的,它仍然會把這個事件傳給它的子控件)之后這個手勢所有的事件將全部攔截,也就是說這個事件對于當前控件和它的子控件而言已經結束了。
簡單來說就是他不是一個完整的手勢響應 例如 子控件只是響應了down 而父控件把子控件的up事件攔截了 這個時候就會觸發cancel事件 來區分up事件(兒子自己收到微信媽媽要給他一個蘋果down,老爹給攔截了。
知道原因那就好辦了,加上MotionEvent.ACTION_CANCEL事件,把MotionEvent.ACTION_UP里的內容copy進去,完美。
最后來說一下onTouch的常用事件:
1、ACTION_DOWN:表示按下了屏幕,第一個執行也是必然執行的方法。
2、ACTION_MOVE:表示為移動手勢,會不斷的執行直到觸摸停止。
3、ACTION_UP :表示為離開屏幕,觸摸停止的時候執行。
4、ACTION_CANCEL:事件被上層攔截 時觸發。
參考:
http://www.gcssloop.com/customview/motionevent
https://blog.csdn.net/cqx13763055264/article/details/86543140
https://blog.csdn.net/lovelyprogrammer/article/details/79608132