关于dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的分发机制浅析

虽说这个问题不是很难...动动手就能看出答案...但是似乎不太容易理解...几次尝试把这个问题说明白....但是好像感觉说不明白....(顿时想起了那句话----说不明白就是自己还不明白! 我怎么可能不明白..so)
这里面牵扯到Activity的dispatchTouchEvent, onTouchEvent以及ViewGroup的dispatchTouchevent, onInterceptTouchEvent, onTouchEvent还有View的dispatchTouchEvent, onTouchEvent
(别嫌我..多一嘴View没有onInterceptTouchEvent).
前沿: 知识储备...默认只有View的onTouchEvent返回true其它都返回false; true意味着本View需要处理(ViewGroup也是View), false则代表不处理继续分发.
0. 这个事件的执行顺序是activity的dispatchTouchEvent先接收到down事件..然后由父往子执行....如果期间没有视图的onTouchEvent返回true的, 那不好意思..只能由activity的onTouchEvent执行了(自个走完down, move, up)
06-10 17:08:29.535: V/Activity(3174): dispatchTouchEvent DOWN
06-10 17:08:29.535: V/ViewGroup1(3174): onInterceptTouchEvent DOWN
06-10 17:08:29.535: V/ViewGroup2(3174): onInterceptTouchEvent DOWN
06-10 17:08:29.535: V/Activity(3174): onTouch DOWN
06-10 17:08:29.535: V/Child(3174): onTouchEvent DOWN
06-10 17:08:29.535: V/ViewGroup2(3174): onTouchEvent DOWN
06-10 17:08:29.535: V/ViewGroup1(3174): onTouchEvent DOWN
06-10 17:08:29.535: V/Activity(3174): onTouchEvent DOWN
06-10 17:08:29.565: V/Activity(3174): dispatchTouchEvent MOVE
06-10 17:08:29.565: V/Activity(3174): onTouchEvent MOVE
06-10 17:08:29.575: V/Activity(3174): dispatchTouchEvent MOVE
06-10 17:08:29.575: V/Activity(3174): onTouchEvent MOVE
06-10 17:08:29.575: V/Activity(3174): dispatchTouchEvent UP
06-10 17:08:29.575: V/Activity(3174): onTouchEvent UP
这么多...咱就先抛开所有的dispatchTouchEvent先来分析onInterceptTouchEvent和onTouchEvent
1. 如果有哪个View的onInterceptTouchEvent返回true, 并且该View的onTouchEvent也返回true了....
本View的onInterceptTouchEvent走完down之后就跟它没关系了.
下面是ViewGroup2的情况.
06-10 16:36:24.881: V/Activity(30631): dispatchTouchEvent DOWN
06-10 16:36:24.881: V/ViewGroup1(30631): onInterceptTouchEvent DOWN
06-10 16:36:24.881: V/ViewGroup2(30631): onInterceptTouchEvent DOWN
06-10 16:36:24.881: V/ViewGroup2(30631): onTouchEvent DOWN
06-10 16:36:24.911: V/Activity(30631): dispatchTouchEvent MOVE
06-10 16:36:24.911: V/ViewGroup1(30631): onInterceptTouchEvent MOVE
06-10 16:36:24.911: V/ViewGroup2(30631): onTouchEvent MOVE
06-10 16:36:24.921: V/Activity(30631): dispatchTouchEvent MOVE
06-10 16:36:24.921: V/ViewGroup1(30631): onInterceptTouchEvent MOVE
06-10 16:36:24.921: V/ViewGroup2(30631): onTouchEvent MOVE
06-10 16:36:24.951: V/Activity(30631): dispatchTouchEvent UP
06-10 16:36:24.951: V/ViewGroup1(30631): onInterceptTouchEvent UP
06-10 16:36:24.951: V/ViewGroup2(30631): onTouchEvent UP
2. 如果有哪个onInterceptTouchEvent返回true了, 但是onTouchEvent返回false了.遵循第0规律
06-10 16:43:50.496: V/Activity(32620): dispatchTouchEvent DOWN
06-10 16:43:50.496: V/ViewGroup1(32620): onInterceptTouchEvent DOWN
06-10 16:43:50.496: V/ViewGroup2(32620): onInterceptTouchEvent DOWN
06-10 16:43:50.496: V/ViewGroup2(32620): onTouchEvent DOWN
06-10 16:43:50.496: V/ViewGroup1(32620): onTouchEvent DOWN
06-10 16:43:50.496: V/Activity(32620): onTouchEvent DOWN
06-10 16:43:50.556: V/Activity(32620): dispatchTouchEvent MOVE
06-10 16:43:50.556: V/Activity(32620): onTouchEvent MOVE
06-10 16:43:50.576: V/Activity(32620): dispatchTouchEvent MOVE
06-10 16:43:50.576: V/Activity(32620): onTouchEvent MOVE
06-10 16:43:50.586: V/Activity(32620): dispatchTouchEvent UP
06-10 16:43:50.586: V/Activity(32620): onTouchEvent UP
3. 还有第三种吗...第三种就是默认情况了....只走Child的onTouchEvent, 那就遵循第1条规律
06-10 16:49:04.191: V/Activity(746): dispatchTouchEvent DOWN
06-10 16:49:04.191: V/ViewGroup1(746): onInterceptTouchEvent DOWN
06-10 16:49:04.191: V/ViewGroup2(746): onInterceptTouchEvent DOWN
06-10 16:49:04.191: V/Activity(746): onTouch DOWN
06-10 16:49:04.191: V/Child(746): onTouchEvent DOWN
06-10 16:49:04.261: V/Activity(746): dispatchTouchEvent MOVE
06-10 16:49:04.261: V/ViewGroup1(746): onInterceptTouchEvent MOVE
06-10 16:49:04.261: V/ViewGroup2(746): onInterceptTouchEvent MOVE
06-10 16:49:04.261: V/Activity(746): onTouch MOVE
06-10 16:49:04.271: V/Child(746): onTouchEvent MOVE
06-10 16:49:04.271: V/Activity(746): dispatchTouchEvent UP
06-10 16:49:04.271: V/ViewGroup1(746): onInterceptTouchEvent UP
06-10 16:49:04.271: V/ViewGroup2(746): onInterceptTouchEvent UP
06-10 16:49:04.271: V/Activity(746): onTouch UP
06-10 16:49:04.271: V/Child(746): onTouchEvent UP
最后加上这个dispatchTouchEvent,这个View要是走的话...先走dispatchTouchEvent, 如果返回true的话,那就跟本View的onInterceptTouchEvent和onTouchEvent没关系了.自己处理了, 不分发了.
下面我把ViewGroup2的dispatchTouchEvent返回true(ViewGroup1的dispatchTouchEvent注释了.)
06-10 16:52:52.284: V/Activity(1403): dispatchTouchEvent DOWN
06-10 16:52:52.284: V/ViewGroup1(1403): onInterceptTouchEvent DOWN
06-10 16:52:52.284: V/ViewGroup2(1403): dispatchTouchEvent DOWN
06-10 16:52:52.324: V/Activity(1403): dispatchTouchEvent MOVE
06-10 16:52:52.324: V/ViewGroup1(1403): onInterceptTouchEvent MOVE
06-10 16:52:52.334: V/ViewGroup2(1403): dispatchTouchEvent MOVE
06-10 16:52:52.345: V/Activity(1403): dispatchTouchEvent MOVE
06-10 16:52:52.345: V/ViewGroup1(1403): onInterceptTouchEvent MOVE
06-10 16:52:52.345: V/ViewGroup2(1403): dispatchTouchEvent MOVE
06-10 16:52:52.365: V/Activity(1403): dispatchTouchEvent MOVE
06-10 16:52:52.365: V/ViewGroup1(1403): onInterceptTouchEvent MOVE
06-10 16:52:52.365: V/ViewGroup2(1403): dispatchTouchEvent MOVE
06-10 16:52:52.375: V/Activity(1403): dispatchTouchEvent UP
06-10 16:52:52.375: V/ViewGroup1(1403): onInterceptTouchEvent UP
06-10 16:52:52.375: V/ViewGroup2(1403): dispatchTouchEvent UP
说到底就是拦不拦截, 与拦截了处不处理的问题! 拦截处理..那好...再来一遍该来的....拦截不处理..那由里往外再出去(期间碰到处理的, 那就跟0条一样了.), 不拦截, 处理(有处理机会)跟拦截处理一样..
终于写完了...发现自己越来越懂了...要是没明白的话...建议自己写一下...
关于dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的分发机制浅析的更多相关文章
- Android事件分发机制浅析(1)
本文来自网易云社区 作者:孙有军 事件机制是Android中一个比较复杂且重要的知识点,比如你想自定义拦截事件,或者某系组件中嵌套了其他布局,往往会出现这样那样的事件冲突,坑爹啊!!事件主要涵盖onT ...
- dispatchTouchEvent & onInterceptTouchEvent & onTouchEvent
http://www.cnblogs.com/jqyp/archive/2012/04/25/2469758.html dispatchTouchEvent 分发 onInterceptT ...
- Android事件分发机制浅析(2)
本文来自网易云社区 作者:孙有军 上面的两次执行中每次都调用了onInterceptTouchEvent事件,这个到底又是啥?我们去看看他的返回值是什么? public boolean onInter ...
- Android事件分发机制浅析(3)
本文来自网易云社区 作者:孙有军 我们只看最重要的部分 1: 事件为ACTION_DOWN时,执行了cancelAndClearTouchTargets函数,该函数主要清除上一次点击传递的路径,之后执 ...
- Atitit View事件分发机制
1. Atitit View事件分发机制 1. Atitit View事件分发机制1 1.1. 三个关键方法 dispatchTouchEvent onInterceptTouchEvent onTo ...
- Android View 事件分发机制详解
想必很多android开发者都遇到过手势冲突的情况,我们一般都是通过内部拦截和外部拦截法解决此类问题.要想搞明白原理就必须了解View的分发机制.在此之前我们先来了解一下以下三个非常重要的方法: di ...
- Android View框架总结(八)ViewGroup事件分发机制
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52298780 上篇分析了View的事件分发流程,留了一个问题:如果上 ...
- Android中的事件分发机制
Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...
- 拇指记者深入Android公司,打探事件分发机制背后的秘密
前言 聊到事件分发,很多朋友就会想到view的dispatchTouchEvent,其实在此之前,Android还做了很多工作. 比如跨进程获取输入事件的方式?在dispatchTouchEvent责 ...
随机推荐
- ORA-15177: cannot operate on system aliases (DBD ERROR: OCIStmtExecute)
ASM操作的时候,删除一个文件夹,删除不了,报错如下: ASMCMD> ls -l Type Redund Striped Time Sys Name Y IPAP/ ASMCMD> rm ...
- Motan学习开篇
你已经走到这里了,后面只要耐心的走下去就行了. --佚名 入职新公司以后,公司使用dubbo框架,简单的照葫芦画瓢之后,也算是入手了,但是其中内部的实现的机制一概不懂.我单纯的有种好奇心,觉得每个 ...
- 如何给10^7个数据量的磁盘文件排序--bitset
题目: 输入:给定一个文件,里面最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数),且其中每个数都小于等于n,n=10^7.输出:得到按从小到大升序排列的包含所有输入的整数的列表. 分 ...
- hadoop-1.1.2集群搭建
Hadoop安装分为三种不同模式: 本地模式:hadoop在运行时,不使用hdfs,而是使用linux操作系统的文件系统.(默认hadoop就是本地模式) 伪分布模式:在一个节点上运行hadoop(指 ...
- linux查看端口信息以及关闭进程
lsof -i:6633 查看端口6633的使用情况 kill (+PID数值),结束进程
- cloud maintenance of OpenNebula
OpenNebula 4.4.1 maintenance release,官方建议当前的生产环境使用3.x or 4.x的其它版本; php调用curl工具伪造ip Upgrading from Op ...
- UVALive 7274 Canvas Painting (优先队列)
Canvas Painting 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/C Description http://7xjo ...
- WEB开发框架
- Python多线程学习资料1
一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1. 函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...
- java 2 8 10 16
An integer literal may be expressed in decimal (base 10), hexadecimal (base 16), octal (base 8), or ...