解决自定义View触发ACTION_CANCEL
来源:互联网 发布:phpci连接不上数据库 编辑:程序博客网 时间:2024/06/06 00:41
国外网站对于ACTION_CANCEL的解释为
You receive this when a parent takes possession of the motion, for example when the user has dragged enough across a list view or scroll view that it will start scrolling instead of letting you press the buttons inside of it.
而在国内论坛,也看到了其他一些解释:
1. 在设计设置页面的滑动开关时,如果不监听ACTION_CANCEL,在滑动到中间时,如果你手指上下移动,就是移动到开关控件之外,则此时会触发ACTION_CANCEL,而不是ACTION_UP,造成开关的按钮停顿在中间位置。
意思就是,当用户保持按下操作,并从你的控件转移到外层控件时,会触发ACTION_CANCEL,建议进行处理
- ACTION_CANCEL事件,官方文档讲的是当前手势被释放,你将不会接收到其他的事件,应该向ACTION_UP一样对待它。
那到底什么情况会触发这个事件呢?当 当前控件(子控件,儿子)收到前驱事件(ACTION_MOVE或者ACTION_MOVE)后,它的父控件(老爸)突然插手,截断事件的传递,这时,当前控件就会收到ACTION_CANCEL,收到此事件后,不管子控件此时返回true或者false,都认为这一个动作已完成,不会再回传到父控件的OnTouchEvent中处理,同时后续事件,会通过dispatchEvent方法直接传送到父控件这里来处理。这和之前的结论有点相悖,之前说过如果子控件的OnTouchEvent返回false,表明事件未被处理,是回传到父控件去处理的,这里纠正一下,只有ACTION_DOWN事件才可以被回传,ACTION_MOVE和ACTION_UP事件会跟随ACTION_DOWN事件,即ACTION_DOWN是哪个控件处理的,后续事件都传递到这里,不会上抛到父控件,ACTION_CANCEL也不能回传。还有一点,触摸区域的范围问题,如果触摸区域在子控件内,同时父控件没有截断事件传递,刚不管子控件是否拦截此事件,都会传递到子控件的OnTouchEvent中处理,可以看成一种责任吧,因为我点的就是你,你父亲没有拦截,说明他不想处理,那到你这里了,不管你拦不拦截,都得你来处理。
结论:ACTION_CANCEL事件是收到前驱事件后,后续事件被父控件拦截的情况下产生,onTouchEvent的事件回传到父控件只会发生在ACTION_DOWN事件中。
所以当父View拦截到后续事件时才会触发ACTION_CENCEL,我们正常的流程只有DOWN,UP,MOVE,这三个事件,所以保证ACTION_CENCEL事件不会触发即可。
所以我加了一行代码:requestDisallowInterceptTouchEvent(true);,当然,具体情况具体分析,目前我的问题已经被解决了。
@Override public boolean onTouch(View v, MotionEvent event) { //通知父View不要拦截当前view的事件 requestDisallowInterceptTouchEvent(true); dx = 0; float mx = 0; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; } return true; }
- 解决自定义View触发ACTION_CANCEL
- ACTION_CANCEL事件的触发条件
- android 自定义View事件触发顺序
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件是什么意思,如何触发
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- 自定义View解决滑动冲突
- 自定义View解决滑动冲突
- View点击过快导致事件多此触发,全局解决
- Android_自定义View---三种事件的触发、自定义View属性
- 解决NestedScrollView中,在子View上滑动不触发滚动事件,却触发点击事件
- 自定义CheckBox解决label点击事件触发两次问题
- malloc_error_break
- 安全渗透测试笔记-----安全漏洞生命周期
- static修饰符
- jenkins-master-slave分布式搭建、使用和集群测试环境原理、部署及常见问题解决
- Adobe 全系列 更新至Adobe CC 2017
- 解决自定义View触发ACTION_CANCEL
- 【错误解决】IDEA的一个错误@Query异常报错
- React Native 学习笔记(三)---自上而下,直觉理解
- 线上服务CPU100%问题快速定位实战
- spring boot:配置mybatis以及注解事务
- 解决mysql连表查询别名不起作用,同名的字段只能显示其中一个字段值。
- 代理模式
- 洛谷1011 车站(数学,模拟)
- hdu6198 number number number(矩阵快速幂模板题)