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事 ...
随机推荐
- 安装Ubuntu时分区选择
最近购买来一台二手笔记本.型号是:Dell Latitude D520.回来之后就装上来Ubuntu12.04,开始是安装的UbuntuKylin 13.04.不知道是机器配置不行,还是本身系统有点卡 ...
- jQuery之on
在jQuery1.9版本中,已经去掉了live和delegate方法,从而将on方法的地位进一步提升. jQuery如此推崇on方法,必有其牛逼的地方.那么我们就有必要了解这个on,并在代码中利用它, ...
- iOS开发之SQLite--C语言接口规范(四) —— Result Values From A Query
数据库的在上一篇博客中<SQLite之C语言接口规范(三)——Binding Values To Prepared Statements>用到了如何从查询结果中取出结果值.今天的博客就详细 ...
- iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇
前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...
- geotrellis使用(十八)导入多波段Tiff、读取多波段Tile
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 多波段数据导入 读取多波段瓦片 提取单波段 总结 一 ...
- 如何设置UILabel中的字体的间距
cell.teacherDescriptionLabel.text = content; cell.teacherDescriptionLabel.textAlignment = NSTextAlig ...
- Linux添加用户(user)到用户组(group)
将一个用户添加到用户组中,千万不能直接用: usermod -G groupA 这样做会使你离开其他用户组,仅仅做为 这个用户组 groupA 的成员. 应该用 加上 -a 选项: usermod - ...
- CentOS 7.2 yum方式安装MySQL 5.7
CentOS 7之后的版本yum的默认源中使用MariaDB替代原先MySQL,因此安装方式较为以往有一些改变: 下载mysql的源 wget http://dev.mysql.com/get/mys ...
- 探秘Tomcat——一个简易的Servlet容器
即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...
- 浅谈2D游戏设计模式2- WZ文件详解(UI.WZ)之MapLogin.img(1)
玩过冒险岛的人都知道有一个WZ文件,那么这个WZ文件的内部是怎么样的呢,今天我就带大家一探究竟. 说实在的,我这是第一次接触WZ文件,但是却让我很震撼,为什么很震撼,因为这个居然是用VS2010写的! ...