关于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责 ...
随机推荐
- motan解读:添加spring 支持
代码位置: motan-core的目录下 motan中使用spring管理配置对象.motan利用Spring的spi机制创建了自定义标签和相应的标签处理代码.具体使用方法见这篇.本文以m ...
- Windows Azure Platform (一) 云计算的出现
<Windows Azure Platform 系列文章目录> 最近的一年一直致力于微软云计算技术的推广和研究,对于微软的云计算平台Windows Azure Platform有一定的了解 ...
- 设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)
本文出自 代码大湿 代码大湿 本系列持续更新,敬请关注. 1 静态工厂 静态工厂介绍: 静态工厂模式可以实现接口封装隔离的原则.在客户端只知接口而不知实现的时候可以使用静态工厂模式. 源码请点击我 角 ...
- AspNetPager 的使用
下面选用的是新闻发布系统里用的代码. SQL 存储过程: CREATE PROCEDURE procNewsSelectByPager @startRecordIndex int, @endRecor ...
- http协议中的Content-Type
今天对http协议中的Content-Type有所理解了 它的主要功给我的感觉,还是在前台(客户端)给服务器传输数据时,描述这个数据的格式. 比如,我只传一个表单数据,但这个表单中只有文本,没有其它的 ...
- SpringMVC 避免IE执行AJAX时,返回JSON出现下载文件
<?xml version="1.0" encoding="UTF-8"?> <!-- SpringMVC配置文件 --> <be ...
- JavaScript——以简单的方式理解闭包
闭包,在一开始接触JavaScript的时候就听说过.首先明确一点,它理解起来确实不复杂,而且它也非常好用.那我们去理解闭包之前,要有什么基础呢?我个人认为最重要的便是作用域(lexical scop ...
- URAL 2045 Richness of words (回文子串,贪心)
Richness of words 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/J Description For each ...
- UVA 315 315 - Network(求割点个数)
Network A Telephone Line Company (TLC) is establishing a new telephone cable network. They are con ...
- [iOS 多线程 & 网络 - 3.0] - 在线动画Demo
A.需求 所有数据都从服务器下载 动画列表包含:图片.动画名标题.时长副标题 点击打开动画观看 code source: https://github.com/hellovoidworld/Vid ...