Android View事件传递机制
ViewGroup
dispatchTouchEvent onInterceptTouchEvent onTouch
View
dispatchTouchEvent onTouch
假设View的层级关系如下
<ViewGroup1>
<ViewGroup2>
<View/>
</ViewGroup2>
</ViewGroup1>
- View事件传递顺序ACTION_DOWN
由最上层ViewGroup通过dispathcTouchEvent,如果事件没有被消费(dispatchTouchEvent return true),或者拦截(onInterceptTouchEvent return true),就会逐层传往下递到最底层View,如下所示
Activity.dispatchTouchEvent-->ViewGroup1.dispatchTouchEvent-->ViewGroup1.onInterceptTouchEvent-->ViewGroup2.dispatchTouchEvent-->ViewGroup2.onInterceptTouchEvent-->View.dispatchTouchEvent
如果事件没有被消费(onTouchEvent return true),会逐层往上调用onTouchEvent,如下所示
View.onTouchEvent()->ViewGroup1.onTouchEvent()->ViewGroup1.onTouchEvent()->Activity.onTouchEvent();
由于ACTION_DOWN事件没有被消费,说明下层View对点击事件没有兴趣,ACTION_MOVE事件不会再继续往下传递
如果事件被消费,比如设置onTouchListener或者onTouchEvent返回true,则事件不会往上传递,哪一层消费,再往上的onTouchEvent就不会被调用。而且底部的ViewGroup,View继续会接收之后传进来的ACTION_MOVE事件
- requestDisallowInterceptTouchEvent(true)
如果子View在消费onTouch事件之后(比如ACTION_DOWN),调用getParent.requestDisallowInterceptTouchEvent(true),那么下一个ACTION_MOVE到来的时候,不会再调用View的父Group的onInterceptTouchEvent()方法
即:子View没有调用requestDisallowInterceptTouchEvent(true); (onInterceptTouchEvent用OITE缩写,onTouchEvent用OTE缩写)
VG1.OITE(ACTION_DOWN)->VG2.OITE(ACTION_DOWN)->VIEW.OTE(ACTION_DOWN) return true
如果子View在onTouchEvent里调用getParent().requestDisallowInterceptTouchEvent(true),则事件传递会变为如下(ACTION_DOWN事件之后会传来ACTION_MOVE)
VG1.OITE(ACTION_MOVE)->VG2.OITE(ACTION_MOVE)->VIEW.OTE(ACTION_MOVE) return true(中间划横线表示这个方法没被调用了)
注:dispatchTouchEvent会继续调用
- 总结,
1.哪一层dispatchTouchEvent消费事件,事件就不会往下传,
2.哪一层消费onTouchEvent,事件onTouchEvent就不会再往上传
3.如果没有消费ACTION_DOWN,ACTION_MOVE不会像ACTION_DOWN一样,一层一层往下传,直接Activity.dispatchTouchEvent->Activity.onTouchEvent
相反,如果有消费ACTION_DOWN,ACTION_MOVE事件还是会像ACTION_DOWN一样,一层一层往下传,原理和ACTION_DOWN一样
即,如果消费了ACTION_DOWN,ACTION_MOVE才会传下来,如果消费了ACTION_MOVE,ACTION_UP事件才会传下来
不消费ACTION_DOWN,其他事件不会再传下来
Android View事件传递机制的更多相关文章
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)
ViewGroup View Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
- 【转】Android TouchEvent事件传递机制
Android TouchEvent事件传递机制 事件机制参考地址: http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html ht ...
- Android Touch事件传递机制通俗讲解
在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...
- 初识Android触摸事件传递机制
前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...
- Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android 的事件传递机制,详解
Android 的事件传递机制,详解 前两天和一个朋友聊天的时候.然后说到事件传递机制.然后让我说的时候,忽然发现说的不是非常清楚,事实上Android 的事件传递机制也是知道一些,可是感觉自己知道的 ...
- Android Touch事件传递机制引发的血案
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38942135 关于Android Touch事件传递机制我之前也写过两篇文章,自觉得对Tou ...
随机推荐
- JNI读取assets资源文件
源自:http://www.rosoo.net/a/201112/15459.html assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取 ...
- proc_dir_entry
struct proc_dir_entry { unsigned int low_ino; unsigned short namelen; const cha ...
- BZOJ 1297 迷路(矩阵)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1297 题意:给出一个带权有向图,权值为1-9,顶点个数最多为10.从1出发恰好在T时刻到 ...
- 查看局域网内某个ip的mac地址
首先需要ping一下对方的ip,确保本地的arp表中缓存对方的ip和mac的关系 C:\Windows\System32>ping 192.168.1.231 正在 Ping 192.168 ...
- Android Things:Raspberry Pi 3 B 刷入 Android Things
参考文章: http://www.andtuts.com/a-beginners-guide-to-raspberry-pi-3-b-and-android-things/?utm_source=An ...
- chrome 31删除输入框的历史记录
chrome 31删除输入框的历史记录 TMD居然要用Shift + delete 了.... 为毛!!!
- 宏HASH_GET_NEXT
/*******************************************************************//** Gets the next struct in a h ...
- c#里面的namespace基础(一)
我现在感到学好C#就是就是要知道,C#的基本语法,C#的新的特点,C#能干什么! 其中我感到不管如何,NAMESPACE都是很关键的,可以说不是只对C#而言,而是整个.NET都是由NAMESPACE组 ...
- UVa 524 Prime Ring Problem【回溯】
题意:给出n,把从1到n排成一个环,输出相邻两个数的和为素数的序列 照着紫书敲的, 大概就是这个地方需要注意下,初始化的时候a[0]=1,然后dfs(1),从第1个位置开始搜 #include< ...
- PHP查询数据库中满足条件的记录条数(二种实现方法)
在需要输出网站用户注册数或者插入数据之前判断是否有重复记录时,就需要获取满足条件的MySQL查询的记录数目,接下来介绍两种查询统计方法,感兴趣的朋友可以了解下啊,或许对你有所帮助 在需要输出网 ...