开发者社区> 壮壮father> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Android事件分发机制详解

简介: 事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等 2、常用的方法有:disPatchTouchEvent(),onTouchEvent(),onI...
+关注继续查看

事件分发机制详解

一、基础知识介绍

1、经常用的事件有:MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVEMotionEvent.ACTION_UP

2、常用的方法有:disPatchTouchEvent()onTouchEvent()onInterceptTouchEvent()(只有ViewGroup才有这个方法,View没有这个方法,且ViewGroupView的子类);

二、方法功能介绍

1dispatchTouchEvent事件分发的调度者与指挥者,触发的第一个方法

2onInterceptTouchEvent,决定是否拦截事件:

3、如果拦截事件,调用当前控件的onTouchEvent方法,

4、如果不拦截,判断是否有子控件,

5onTouchEvent,决定是否消费事件,消费返回True,不消费返回False。如果返回的为false,之后的事件都不会再传递到当前的控件了(会不再访问当前控件),如果返回true,之后的事件依然还是会传递过来的。

三、各个方法和控件之间事件传递关系

事件传递流程:事件—>Activity>Window>DecorView>ViewTree(嵌套在一起的各种控件)

一个事件,首先会由ActivitydispatchTouchEvent方法接受,然后分发到附着在Activity上的WindowWindow不进行处理直接分发到ViewTree;最外层的ViewTop(默认为是ViewGroup类型的)会先调用自己的dispatchTouchEvent方法,然后由dispatchTouchEvent调用onInterceptTouchEvent方法,如果返回true,调用自己的onTouchEvent方法;如果返回false,继续向下一个控件进行事件分发。

如果ViewTree中的所有控件都不消费,那就返回到Activity中,由Activity调用onTouchEvent方法。

下面给大家一个具体的例子,大家可以有一个形象的感受。

 

四、示例Demo(示例中的代码是不考虑下面说的特殊情况的)

布局文件

<VP1>

<VP2>

<CustomView/>

</VP2>

</VP1>

1、控件都不消费

down事件

Log:-Activity:dispatchTouchEvent:调用

Log:-VP1:dispatchTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:返回:false

Log:-VP2:dispatchTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:返回:false

Log:-CustomView:dispatchTouchEvent:调用

Log:-CustomView:touchEvent:调用

Log:-CustomView:touchEvent:返回:false

Log:-CustomView:dispatchTouchEvent:返回:false

Log:-VP2:touchEvent:调用

Log:-VP2:touchEvent:返回:false

Log:-VP2:dispatchTouchEvent:返回:false

Log:-VP1:touchEvent:调用

Log:-VP1:touchEvent:返回:false

Log:-VP1:dispatchTouchEvent:返回:false

Log:-Activity:touchEvent:调用

Log:-Activity:touchEvent:返回:false

Log:-Activity:dispatchTouchEvent:返回:false

up事件

Log:-Activity:dispatchTouchEvent:调用

Log:-Activity:touchEvent:调用

Log:-Activity:touchEvent:返回:false

Log:-Activity:dispatchTouchEvent:返回:false

 

2、CustomView消费

down事件

Log:-Activity:dispatchTouchEvent:调用

Log:-VP1:dispatchTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:返回:false

Log:-VP2:dispatchTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:返回:false

Log:-CustomView:dispatchTouchEvent:调用

Log:-CustomView:touchEvent:调用

Log:-CustomView:touchEvent:返回:true

Log:-CustomView:dispatchTouchEvent:返回:true

Log:-VP2:dispatchTouchEvent:返回:true

Log:-VP1:dispatchTouchEvent:返回:true

Log:-Activity:dispatchTouchEvent:返回:true

Up事件

Log:-Activity:dispatchTouchEvent:调用

Log:-VP1:dispatchTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:返回:false

Log:-VP2:dispatchTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:返回:false

Log:-CustomView:dispatchTouchEvent:调用

Log:-CustomView:touchEvent:调用

Log:-CustomView:touchEvent:返回:true

Log:-CustomView:dispatchTouchEvent:返回:true

Log:-VP2:dispatchTouchEvent:返回:true

Log:-VP1:dispatchTouchEvent:返回:true

Log:-Activity:dispatchTouchEvent:返回:true

 

3、VP2拦截不消费

Down事件

Log:-Activity:dispatchTouchEvent:调用

Log:-VP1:dispatchTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:返回:false

Log:-VP2:dispatchTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:返回:true

Log:-VP2:touchEvent:调用

Log:-VP2:touchEvent:返回:false

Log:-VP2:dispatchTouchEvent:返回:false

Log:-VP1:touchEvent:调用

Log:-VP1:touchEvent:返回:false

Log:-VP1:dispatchTouchEvent:返回:false

Log:-Activity:touchEvent:调用

Log:-Activity:touchEvent:返回:false

Log:-Activity:dispatchTouchEvent:返回:false

UP事件

Log:-Activity:dispatchTouchEvent:调用

Log:-Activity:touchEvent:调用

Log:-Activity:touchEvent:返回:false

Log:-Activity:dispatchTouchEvent:返回:false

4、VP2拦截消费

Down事件

Log:-Activity:dispatchTouchEvent:调用

Log:-VP1:dispatchTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:返回:false

Log:-VP2:dispatchTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:调用

Log:-VP2:onInterceptTouchEvent:返回:true

Log:-VP2:touchEvent:调用

Log:-VP2:touchEvent:返回:true

Log:-VP2:dispatchTouchEvent:返回:true

Log:-VP1:dispatchTouchEvent:返回:true

Log:-Activity:dispatchTouchEvent:返回:true

UP事件

Log:-Activity:dispatchTouchEvent:调用

Log:-VP1:dispatchTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:调用

Log:-VP1:onInterceptTouchEvent:返回:false

Log:-VP2:dispatchTouchEvent:调用

Log:-VP2:touchEvent:调用

Log:-VP2:touchEvent:返回:true

Log:-VP2:dispatchTouchEvent:返回:true

Log:-VP1:dispatchTouchEvent:返回:true

Log:-Activity:dispatchTouchEvent:返回:true

 

五、特殊情况

1、如果disallowIntercept=true,那么不会再走控件中的onInterceptTouchEvent方法,直接标记为不拦截事件。

2、如果有requestDisallowInterceptTouchEvent(true)方法,父类控件不走onInterceptTouchEvent方法,不用通过回调来判断是否需要拦截事件,而是直接进行传送。

3、这两方面,主要是用来解决手势冲突的。

六、小提示

1、如果满足下列条件之一,就会调用onTouchEvent方法。

  1. 所处的view拦截了事件
  2. 没有子View
  3. View都不消费事件

2、onTouchListener中的onTouch回调与dispatchTouchEvent的优先级一样,都是优先于onTouchEvent

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )(四)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )(四)
41 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )(二)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )(二)
49 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )(二)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )(二)
42 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )(四)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )(四)
34 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )(二)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )(二)
56 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 )(二)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 )(二)
46 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
88 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )(一)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )(一)
56 0
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )(二)
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )(二)
33 0
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
161 0
+关注
壮壮father
从14年开始从事安卓开发。喜欢接触新鲜事物,不断的挑战自己
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android插件化:从入门到放弃
立即下载
58同城Android客户端Walle框架演进与实践之路
立即下载
《深入探索Android热修复技术原理》
立即下载