尊重原创,本文转自: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
网友评论