Android Touch事件分发机制学习
Android 事件分发机制
ViewGroup
dispatchTouchEvent 返回true
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
MyrelativeLayout dispatchTouchEvent: ACTION_UP
ViewGroup自己在dispatchTouchEvent中消费这个事件
dispatchTouchEvent 返回false
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
onTouchEvent: Activity ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
onTouchEvent: Activity ACTION_UP
回传到Activity中onTouchEvent消费事件
dispatchTouchEvent 返回 super.dispatchTouchEvent(ev)子View也都返回super
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOW
MyrelativeLayout onInterceptTouchEvent ACTION_DO
MyImageView dispatchTouchEvent: ACTION_DOWN
MyImageView onTouchEvent: ACTION_DOWN
MyrelativeLayout: onTouchEvent ACTION_DOWN
onTouchEvent: Activity ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
onTouchEvent: Activity ACTION_UP
ViewGroup返回dispatchTouchEvent,会调用ViewGroup中的onInterceptTouchEvent方法,
如果onInterceptTouchEvent返回super.onInterceptTouchEvent(ev)
就回向下传到子View
子View中调用dispatchTouchEvent与onTouchEvent方法
如果都返回的是super().再向上传到ViewGroup,
这时调用ViewGroup的onTouchEvent,如果返回为super,
刚再向上返回给Activity,调用Activity的onTouchEvent消费
ViewGroup中的onInterceptTouchEvent返回true,onTouchEvent返回super
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout onInterceptTouchEvent ACTION_DOWN
MyrelativeLayout: onTouchEvent ACTION_DOWN
onTouchEvent: Activity ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
onTouchEvent: Activity ACTION_UP
事件从Activty的dispatchTouchEvent开始
调用ViewGroup的dispatchTouchEvent,此时这里返回super
会调用ViewGroup中的onInterceptTouchEvent拦截事件
onInterceptTouchEvent这里返回true,说明拦截
就会交给ViewGroup的onTouchEvent
onTouchEvent这里返回Suepr,不消费,就再向上传给Activity
最后由Activty中的onTouchEvent来消费
ViewGroup中的onInterceptTouchEvent返回true,onTouchEvent返回true(和上面相同最后由ViewGroup来消费)
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DO
MyrelativeLayout onInterceptTouchEvent ACTION_D
MyrelativeLayout: onTouchEvent ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
MyrelativeLayout dispatchTouchEvent: ACTION_UP
MyrelativeLayout: onTouchEvent ACTION_UP
事件从Activty的dispatchTouchEvent开始
调用ViewGroup的dispatchTouchEvent,此时这里返回super
会调用ViewGroup中的onInterceptTouchEvent拦截事件
onInterceptTouchEvent这里返回true,说明拦截
就会交给ViewGroup的onTouchEvent
这里onTouchEvent 返回 true表明,消费,事件到此结束不再传递
ViewGroup中的onInterceptTouchEvent返回true,onTouchEvent返回false(最后由Activty来消费)
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout onInterceptTouchEvent ACTION_DOWN
MyrelativeLayout: onTouchEvent ACTION_DOWN
onTouchEvent: Activity ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
onTouchEvent: Activity ACTION_UP
事件从Activty的dispatchTouchEvent开始
调用ViewGroup的dispatchTouchEvent,此时这里返回super
会调用ViewGroup中的onInterceptTouchEvent拦截事件
onInterceptTouchEvent这里返回true,说明拦截
就会交给ViewGroup的onTouchEvent
这里onTouchEvent 返回 false表明,不消费,
事件会向上传递给Activity来调用onTouchEvent来消费
ViewGroup中的onInterceptTouchEvent返回super
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout onInterceptTouchEvent ACTION_DOWN
MyImageView dispatchTouchEvent: ACTION_DOWN
MyImageView onTouchEvent: ACTION_DOWN
MyrelativeLayout: onTouchEvent ACTION_DOWN
onTouchEvent: Activity ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
onTouchEvent: Activity ACTION_UP
从上到下
Activity dispatchTouchEvent
ViewGroup dispatchTouchEvent
ViewGroup onInterceptTouchEvent
子View的 dispatchTouchEvent
子View的 onTouchEvent
ViewGroud的 onTouchEvent
Acitivty 的 onTouchEvent
View
子View的dispatchTouchEvent返回false
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout onInterceptTouchEvent ACTION_DOWN
MyImageView dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout: onTouchEvent ACTION_DOWN
onTouchEvent: Activity ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
onTouchEvent: Activity ACTION_UP
前提ViewGroup的3个方法都返回super
从上到下
Activity dispatchTouchEvent
ViewGroup dispatchTouchEvent
ViewGroup onInterceptTouchEvent
子View dispatchTouchEvent(返回false直接回返到ViewGroup的onTouchEvent方法)
ViewGroup onTouchEvent
Activity onTouchEvent
子View的dispatchTouchEvent返回true
dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout onInterceptTouchEvent ACTION_DOWN
MyImageView dispatchTouchEvent: ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
MyrelativeLayout dispatchTouchEvent: ACTION_UP
MyrelativeLayout onInterceptTouchEvent ACTION_UP
MyImageView dispatchTouchEvent: ACTION_UP
从上到下
Activity dispatchTouchEvent
ViewGroup dispatchTouchEvent
ViewGroup onInterceptTouchEvent
子View dispatchTouchEvent(返回true直接消费此事件)
子View的 onTouchEvent 返回true
前提
子类的dispatchTouchEvent返回super dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout onInterceptTouchEvent ACTION_DOWN
MyImageView dispatchTouchEvent: ACTION_DOWN
MyImageView onTouchEvent: ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
MyrelativeLayout dispatchTouchEvent: ACTION_UP
MyrelativeLayout onInterceptTouchEvent ACTION_UP
MyImageView dispatchTouchEvent: ACTION_UP
MyImageView onTouchEvent: ACTION_UP
从上到下
Activity dispatchTouchEvent
ViewGroup dispatchTouchEvent
ViewGroup onInterceptTouchEvent
子View dispatchTouchEvent(super)
子View的onTouchEvent返回true消费这个事件,不再向上传递
子View的 onTouchEvent 返回false
前提
子类的dispatchTouchEvent返回super dispatchTouchEvent: Activity ACTION_DOWN
MyrelativeLayout dispatchTouchEvent: ACTION_DOWN
MyrelativeLayout onInterceptTouchEvent ACTION_DOWN
MyImageView dispatchTouchEvent: ACTION_DOWN
MyImageView onTouchEvent: ACTION_DOWN
MyrelativeLayout: onTouchEvent ACTION_DOWN
onTouchEvent: Activity ACTION_DOWN
dispatchTouchEvent: Activity ACTION_UP
onTouchEvent: Activity ACTION_UP
从上到下
Activity dispatchTouchEvent
ViewGroup dispatchTouchEvent
ViewGroup onInterceptTouchEvent
子View dispatchTouchEvent(super)
子View的onTouchEvent返回false
ViewGroud的onTouchEvent
Acitivty的onTouchEvent
事件分发:dispatchTouchEvent
如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
如果 return false,事件分发分为两种情况:
如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent 进行消费。
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑如下:
如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理;
如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View 上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,
如果有子View将事件传给子View由子View的dispatchTouchEvent来处理
如果没有子View并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。
事件响应:public boolean onTouchEvent(MotionEvent ev)
在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑如下:
如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。
如果返回了 true 则会接收并消费该事件。
如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同
源码
https://github.com/ln0491/AndroidTouchDemo
Android Touch事件分发机制学习的更多相关文章
- 【转】Android:Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- Android Touch事件分发机制
参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android Touch事件传递机制详解 下
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...
- Android Touch事件传递机制具体解释 下
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...
- Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)
ViewGroup View Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...
- Android View 事件分发机制 源码解析 (上)
一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
随机推荐
- NFS Volume Provider(Part II) - 每天5分钟玩转 OpenStack(63)
上一节我们将 NFS volume provider 配置就绪,本节将创建 volume. 创建 volume 创建 NFS volume 操作方法与 LVM volume 一样,唯一区别是在 vol ...
- SubSonic3.0.0.4.3源码包与调用Dll
版本修改历史 3.0.0.4.3版修复了下面问题: 修正多表关联查询时,使用左关联和右关联出错问题修正DbDataProvider.cs类的ToEnumerable函数打开数据库链接后没有关闭的问题添 ...
- IOS开发之视图和视图控制器
视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一 ...
- Deffered.js的实现原理
在艾伦的推荐下,看了一个日本人写的延时加载库,非常轻量,写的很棒.作为我的源码学习的第一编. 在认真看了两天之后,才看懂它的实现原理,我下面把通自己的理解,进行了精简.只程现原理,方便日后的回顾.&l ...
- EF7 - What Does “Code First Only” Really Mean
这篇文章很有价值,但翻译了一段,实在翻译不下去了,没办法,只能转载了. 英文地址:http://blogs.msdn.com/b/adonet/archive/2014/10/21/ef7-what- ...
- Mac如何删除MySQL,Mac下MySQL卸载方法
在Mac下安装完MySQL之后,出现了无法启动的问题,多翻尝试依然不能解决问题,最后只能把它删掉. 如何在Mac下删除MySQL呢,只需要在终端执行如下命令就可以把MySQL在Mac下彻底删除干净了. ...
- 6-tips-for-managing-property-files-with-spring--转
原文地址:http://www.summa.com/blog/2009/04/20/6-tips-for-managing-property-files-with-spring What could ...
- C++ 制作 json 数据 并 传送给服务端(Server) 的 php
json数据格式,这里举个基础的例子: {"name":"LGH"} 在C++里面,我用个函数把特定的数据组合成 json void toJson(int co ...
- SSH框架入门知识总结
chap01 领略清晰的MVC流程----Struts讲解技术资料.pdf 提取码:wwi5 chap02 体验控制反转的理念----Spring介绍技术文档.pdf 提取码:0mp3 ch ...
- Oracle普通表->分区表转换(9亿数据量)
背景介绍: 环境:Linux 5.5 + Oracle 10.2.0.4 某普通表T,由于前期设计不当没有分区,如今几年来的数据量已达9亿+, 空间占用大约350G,在线重定义为分区表不现实,故采取申 ...