Android中的事件分发、拦截、消费机制
来源:互联网 发布:php.cgi漏洞 编辑:程序博客网 时间:2024/06/06 02:41
首先明白一个问题,一个完整的Touch事件,应该是由一个Down、一个Up和若干个Move组成的。谁处理了Down事件,他才具有处理UP、MOVE事件。
view有dispatchTouchEvent()、onTouchEvent()。ViewGroup继承View,ViewGroup比View多一个onInterceptTouchEvent()方法。Activity也只有dispatchTouchEvent()、onTouchEvent()两个方法。
dispatchTouchEvent
当有监听到事件时,首先由Activity的捕获到,进入事件分发处理流程。无论是Activity还是View,如前文所说,事件分发自身也具有消费能力。
1. 返回true时,表示改事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结(不见了,被搁浅了)。(Actvitiy\View\ViewGroup都是)
2. 返回false时,表明事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费。(如果是Activity的dispatchTouchEvent,那么Touch将被系统消费或处理。如果是ViewGroup的dispatchTouchEvent,那么Touch交给Activity的onTouchEvent方法处理,如果是View的dispatchTouchEvent,Touch交给ViewGroup的onTouchEvevt()方法处理。)
3 . 返回默认super.dispatchTouchEvent(ev) ,事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理。(如果本层控件是Activity,没有事件拦由于其截,因此将直接将事件传递到子ViewGroup,并交给ViewGroup的事件分发dispatchTouchEvent进行处理,如果是ViewGroup的,事件将分发给本层的ViewGroup事件拦截onInterceptTouchEvent 方法进行处理,如果是view , 事件将分发给本层的view 事件处理onTouchEvent方法进行处理)。
onInterceptTouchEvent(Activity和View都没有此方法)
1. 返回true时,则表示将事件进行拦截,并将拦截到的事件交由本层控件 的 onTouchEvent 进行处理。(Activtiy , View ,ViewGroup三个都是如此)
2. 返回false或是onInterceptTouchEvent(ev)时,则表示不对事件进行拦截,事件得以成功分发到子View,并由子View的dispatchTouchEvent进行处理。()
onTouchEvent
1. 返回true时,表示这层onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。一开始产生的是Down事件,Down事件在这里被处理了,UP、MOVE事件在这个层也被处理了。
2. 返回false或是onInterceptTouchEvent(ev)时,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层View的onTouchEvent进行处理。如果上层在不处理,在往上冒。一直到被处理为止。
总结一下:
1.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。
2.当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。
3.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。当Move和UP事件来时,会先从ViewGroup0传递至ViewGroup1,再由ViewGroup1传递至TextView。
4.当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触发Acitivity的onTouchEvent方法。
5.onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。
- Android中的事件分发、拦截、消费机制
- Android View事件分发、拦截、消费机制
- Android View事件分发、拦截、消费机制
- Android事件的分发、拦截、消费机制简单的流程
- Android事件分发消费机制
- android中的事件分发与消费机制简答介绍
- android事件分发机制和消费机制
- Android事件分发和消费机制总结
- android 事件分发和消费机制
- Android 事件分发与消费机制
- Android Touch事件分发与消费机制
- Android 事件的分发和消费机制
- Android的事件分发与消费机制
- Android之事件分发与消费机制
- android 事件的分发和消费机制
- Android之事件分发和消费机制
- Android Touch事件分发和消费机制
- Android事件分发消费机制理解
- HDU5240 Exam
- BZOJ3774 最优选择-最小割
- 数据结构之单链表实现
- 2017 多校联合集训 问题 C: 瑞神要考研
- 解决Ubuntu安装VM Tools请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。
- Android中的事件分发、拦截、消费机制
- 2017 多校联合集训 问题 H: Envy
- HDU 3345 War Chess(bfs+优先队列)
- 特征工程(补充)--机器学习数据集里的不均衡数据问题
- 文件上传下载整理
- C/C++:递归的一个简单示例
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- HDU 5974 A Simple Math Problem(2016ACM/ICPC亚洲区大连站-重现赛 D题)
- 并查集详解