Android事件分发消费机制理解

来源:互联网 发布:命令行查看数据库内容 编辑:程序博客网 时间:2024/06/06 00:11

以前一直有关注Android事件分发机制,在网上找了很久的资料,但是感觉大多都是晕乎乎的,自己也理解了很久很久,这里写一些自己的理解。
这里的事件响应主要有三种:

  1. onInterceptTouchEvent(MotionEvent ev)—事件拦截
  2. dispatchTouchEvent(MotionEvent ev)—事件分发
  3. 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中,如果不在跳过,如果在,则事件就不再传递下去了。

1 0
原创粉丝点击