安卓-MotionEvent之ACTION_CANCEL
来源:互联网 发布:广州艺知艺术培训学校 编辑:程序博客网 时间:2024/06/06 02:38
国外网站对于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,建议进行处理
2
ACTION_CANCEL事件,官方文档讲的是当前手势被释放,你将不会接收到其他的事件,应该向ACTION_UP一样对待它。
那到底什么情况会触发这个事件呢?当 当前控件(子控件,儿子)收到前驱事件(ACTION_DOWN或者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事件中
实例说明:在下面的实例中,LinearView1是父控件,LayoutView2是子控件,点击区域是LayoutView2,可以看到父控件的onInterceptTouchEvent方法在ACTION_DOWN的时候没有拦截事件,但是在ACTION_MOVE的时候突然插手,拦截掉事件,这时候,子控件就会收到ACTION_CANCEL。
public class LayoutView1 extends LinearLayout { private final String TAG = "LayoutView1"; public LayoutView1(Context context, AttributeSet attrs) { super(context, attrs); Log.d(TAG, TAG); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "1:onInterceptTouchEvent action:ACTION_DOWN"); //return true; break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "1:onInterceptTouchEvent action:ACTION_MOVE"); return true; //break; case MotionEvent.ACTION_UP: Log.d(TAG, "1:onInterceptTouchEvent action:ACTION_UP"); //return true; break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "1:onInterceptTouchEvent action:ACTION_CANCEL"); break; } return false; } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.d(TAG, "1:onTouchEvent action:ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: Log.d(TAG, "1:onTouchEvent action:ACTION_MOVE"); break; case MotionEvent.ACTION_UP: Log.d(TAG, "1:onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG, "1:onTouchEvent action:ACTION_CANCEL"); break; } return true; } }
public class LayoutView2 extends LinearLayout { private final String TAG = "LayoutView2"; public LayoutView2(Context context, AttributeSet attrs) { super(context, attrs); Log.d(TAG,TAG); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch(action){ case MotionEvent.ACTION_DOWN: Log.d(TAG,"2:onInterceptTouchEvent action:ACTION_DOWN"); break; //return true; case MotionEvent.ACTION_MOVE: Log.d(TAG,"2:onInterceptTouchEvent action:ACTION_MOVE"); break; //return true; case MotionEvent.ACTION_UP: Log.d(TAG,"2:onInterceptTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG,"2:onInterceptTouchEvent action:ACTION_CANCEL"); break; } return false; } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch(action){ case MotionEvent.ACTION_DOWN: Log.d(TAG,"2:onTouchEvent action:ACTION_DOWN"); //return false; break; case MotionEvent.ACTION_MOVE: Log.d(TAG,"2:onTouchEvent action:ACTION_MOVE"); return false; //break; case MotionEvent.ACTION_UP: Log.d(TAG,"2:onTouchEvent action:ACTION_UP"); break; case MotionEvent.ACTION_CANCEL: Log.d(TAG,"2:onTouchEvent action:ACTION_CANCEL"); break; } return true; } }
- 安卓-MotionEvent之ACTION_CANCEL
- 安卓-MotionEvent之ACTION_CANCEL
- android MotionEvent.ACTION_CANCEL情景分析
- Android MotionEvent.ACTION_UP和ACTION_CANCEL的区别
- 关于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事件如何被触发?
- android中MotionEvent.ACTION_CANCEL事件如何被触发?
- MotionEvent 详解,安卓 触屏事件
- 安卓自定义View进阶-MotionEvent详解
- 安卓自定义控件(五)触控基础MotionEvent
- 安卓View.onTouchEvent(MotionEvent event) 方法一行一行读
- [leetcode]50 Count and Say
- Android 5.1升级概要
- 1561: (More) Multiplication
- VS在查找预编译头使用时跳过解决
- R语言基本画图函数与多图多线
- 安卓-MotionEvent之ACTION_CANCEL
- LRC分析
- Knockout应用开发指南 第八章:简单应用举例(1)
- PostgreSQL key words of LATERAL
- 12C 前补丁合集 无MOS或有MOS但懒得去查patch No. 的同学入(部分地址不定时更新)
- ASP.NET 全球化和本地化
- Python——UnicodeEncodeError: 'ascii' codec can't encode/decode characters
- 富文本,KindEditor的使用方法及(jsp)案例
- Knockout应用开发指南 第八章:简单应用举例(2)