您的位置:首页 > 移动开发 > Android开发

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一样。

最后整理一下整个流程:

点击页面—>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中,如果不在跳过,如果在,则事件就不再传递下去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: