Android事件分发消费机制理解
2017-03-02 17:09
134 查看
以前一直有关注Android事件分发机制,在网上找了很久的资料,但是感觉大多都是晕乎乎的,自己也理解了很久很久,这里写一些自己的理解。
这里的事件响应主要有三种:
onInterceptTouchEvent(MotionEvent ev)—事件拦截
dispatchTouchEvent(MotionEvent ev)—事件分发
onTouchEvent(MotionEvent ev)—事件响应
其中Activity能够进行响应的是dispatchTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev),它没有onInterceptTouchEvent(MotionEvent ev)。
View类中包含了dispatchTouchEvent(MotionEvent ev),onTouchEvent(MotionEvent ev),它没有onInterceptTouchEvent(MotionEvent ev)。
ViewGroup类中包含了上述3个方法。
一、dispatchTouchEvent:一般不会重写此方法。
二、onInterceptTouchEvent:返回值是true,拦截事件,直接交给此控件的onTouchEvent响应,返回值是false,不拦截,发给子的dispatchTouchEvent响应,返回值是默认的super.onInterceptTouchEvent,默认为false。
三、onTouchEvent:返回true,表示响应事件,处理结束,不用向上审核;返回false,表示不响应,意味着向上审核,就将事件转移给父控件的onTouchEvent来响应,如果父控件也是false,继续冒泡向上传递;默认值super.onTouchEvent,和false一样。
流程1:viewGroup处理onTouchListener事件,onTouchListener的onTouch()方法返回true,表示处理结束,不进入onTouchEvent();onTouch()返回false,进入其onTouchEvent(),如果返回true,处理结束,否则返回给Activity的onTouchEvent();
流程2:执行view的dispatchTouchEvent(),处理onTouchListener事件,onTouchListener的onTouch()方法返回true,表示处理结束,不进入onTouchEvent();onTouch()返回false,进入其onTouchEvent(),如果返回true,处理结束,否则返回给viewGroup的onTouchEvent();
tips:在从ViewGroup分发给view控件的过程中,执行遍历分发的条件是:只有ACTION_DOWN,ACTION_POINTER_DOWN,ACTION_HOVER_MOVE事件才会进入分发,什么ACTION_UP不会哦,进入了遍历流程中,首先会判断点击的事件是否在子view中,如果不在跳过,如果在,则事件就不再传递下去了。
这里的事件响应主要有三种:
onInterceptTouchEvent(MotionEvent ev)—事件拦截
dispatchTouchEvent(MotionEvent ev)—事件分发
onTouchEvent(MotionEvent ev)—事件响应
其中Activity能够进行响应的是dispatchTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev),它没有onInterceptTouchEvent(MotionEvent ev)。
View类中包含了dispatchTouchEvent(MotionEvent ev),onTouchEvent(MotionEvent ev),它没有onInterceptTouchEvent(MotionEvent ev)。
ViewGroup类中包含了上述3个方法。
一、dispatchTouchEvent:一般不会重写此方法。
二、onInterceptTouchEvent:返回值是true,拦截事件,直接交给此控件的onTouchEvent响应,返回值是false,不拦截,发给子的dispatchTouchEvent响应,返回值是默认的super.onInterceptTouchEvent,默认为false。
三、onTouchEvent:返回true,表示响应事件,处理结束,不用向上审核;返回false,表示不响应,意味着向上审核,就将事件转移给父控件的onTouchEvent来响应,如果父控件也是false,继续冒泡向上传递;默认值super.onTouchEvent,和false一样。
最后整理一下整个流程:
点击页面—>Activity的dispatchTouchEvent()—>viewGroup的dispatchTouchEvent()—>这里面通过标识位判断是否拦截,如果拦截—>onInteruptTouchEvent()—>if返回true,表示被拦截,那么子view无法接受到事件了,viewGroup自己处理了,进入下面1流程,if返回false,没有拦截,那么事件分发给子view,进入2流程;流程1:viewGroup处理onTouchListener事件,onTouchListener的onTouch()方法返回true,表示处理结束,不进入onTouchEvent();onTouch()返回false,进入其onTouchEvent(),如果返回true,处理结束,否则返回给Activity的onTouchEvent();
流程2:执行view的dispatchTouchEvent(),处理onTouchListener事件,onTouchListener的onTouch()方法返回true,表示处理结束,不进入onTouchEvent();onTouch()返回false,进入其onTouchEvent(),如果返回true,处理结束,否则返回给viewGroup的onTouchEvent();
tips:在从ViewGroup分发给view控件的过程中,执行遍历分发的条件是:只有ACTION_DOWN,ACTION_POINTER_DOWN,ACTION_HOVER_MOVE事件才会进入分发,什么ACTION_UP不会哦,进入了遍历流程中,首先会判断点击的事件是否在子view中,如果不在跳过,如果在,则事件就不再传递下去了。
相关文章推荐
- Android开发中的事件分发和消费机制的一些理解
- Android事件分发和消费机制理解
- 通俗理解Android事件分发与消费机制
- Android 编程下 Touch 事件的分发和消费机制理解
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Android 编程下 Touch 事件的分发和消费机制
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android 编程下 Touch 事件的分发和消费机制
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android 编程下 Touch 事件的分发和消费机制
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android 编程下 Touch 事件的分发和消费机制
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)