关于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责 ...
随机推荐
- rfid门禁系统笔记
非接触式IC卡性能简介 主要指标: 1:容量为8K 位的EEPROM 2:分为16个扇区,每个扇区为4块,每块16个直接,以块为存取单位 3:每个扇区有独立的一组密码和访问控制 4:每张卡具有唯一的序 ...
- 多校7 HDU5816 Hearthstone 状压DP+全排列
多校7 HDU5816 Hearthstone 状压DP+全排列 题意:boss的PH为p,n张A牌,m张B牌.抽取一张牌,能胜利的概率是多少? 如果抽到的是A牌,当剩余牌的数目不少于2张,再从剩余牌 ...
- 多校5 HDU5787 K-wolf Number 数位DP
// 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...
- 【hadoop代码笔记】hadoop作业提交之汇总
一.概述 在本篇博文中,试图通过代码了解hadoop job执行的整个流程.即用户提交的mapreduce的jar文件.输入提交到hadoop的集群,并在集群中运行.重点在代码的角度描述整个流程,有些 ...
- 《Java数据结构与算法》笔记-CH2无序数组
/** * 本章目标: * 1.自制数组类 * 2.有序数组:按关键字升降序排列:二分法查找 * 3.分析有序数组.大O表示法 */ /** * 自制数组类 书中有的地方有错误,本程序以修改 */ c ...
- Struts2的国际化
1.概述 把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化. 与国际化对应的是本地化, 指让一个具备国际化支持的应用程序支持某个特定的地区 Struts2国际化是建 ...
- Java邮件服务学习之二:SMTP和POP3
一.SMTP SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则.SMTP协议属于TCP/IP协议簇,它帮助每台计算 ...
- awk的二维数组
awk是不支持二维数组的,它的底层是一维数组,将两个key拼接为一维数组的key. 如下是其初始化和遍历 awk 'BEGIN{ for(i=0;i< 3; ++i) for(j = 0; j ...
- 问题-FireDAC连接Sqlite3提示“unable to open database file”
相关资料:http://www.dfwlt.com/forum.php?mod=viewthread&tid=1497&extra= 问题现象:FireDAC连接Sqlite3在开发电 ...
- CodeForces 689D Friends and Subsequences (RMQ+二分)
Friends and Subsequences 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/H Description Mi ...