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事件分发机制学习的更多相关文章

  1. 【转】Android:Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  2. Android Touch事件分发机制

    参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...

  3. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  4. Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  5. Android Touch事件传递机制详解 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  6. Android Touch事件传递机制具体解释 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  7. Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)

      ViewGroup View  Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...

  8. Android View 事件分发机制 源码解析 (上)

    一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...

  9. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

随机推荐

  1. 安装Ubuntu时分区选择

    最近购买来一台二手笔记本.型号是:Dell Latitude D520.回来之后就装上来Ubuntu12.04,开始是安装的UbuntuKylin 13.04.不知道是机器配置不行,还是本身系统有点卡 ...

  2. jQuery之on

    在jQuery1.9版本中,已经去掉了live和delegate方法,从而将on方法的地位进一步提升. jQuery如此推崇on方法,必有其牛逼的地方.那么我们就有必要了解这个on,并在代码中利用它, ...

  3. iOS开发之SQLite--C语言接口规范(四) —— Result Values From A Query

    数据库的在上一篇博客中<SQLite之C语言接口规范(三)——Binding Values To Prepared Statements>用到了如何从查询结果中取出结果值.今天的博客就详细 ...

  4. iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇

    前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...

  5. geotrellis使用(十八)导入多波段Tiff、读取多波段Tile

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 多波段数据导入 读取多波段瓦片 提取单波段 总结 一 ...

  6. 如何设置UILabel中的字体的间距

    cell.teacherDescriptionLabel.text = content; cell.teacherDescriptionLabel.textAlignment = NSTextAlig ...

  7. Linux添加用户(user)到用户组(group)

    将一个用户添加到用户组中,千万不能直接用: usermod -G groupA 这样做会使你离开其他用户组,仅仅做为 这个用户组 groupA 的成员. 应该用 加上 -a 选项: usermod - ...

  8. CentOS 7.2 yum方式安装MySQL 5.7

    CentOS 7之后的版本yum的默认源中使用MariaDB替代原先MySQL,因此安装方式较为以往有一些改变: 下载mysql的源 wget http://dev.mysql.com/get/mys ...

  9. 探秘Tomcat——一个简易的Servlet容器

    即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...

  10. 浅谈2D游戏设计模式2- WZ文件详解(UI.WZ)之MapLogin.img(1)

    玩过冒险岛的人都知道有一个WZ文件,那么这个WZ文件的内部是怎么样的呢,今天我就带大家一探究竟. 说实在的,我这是第一次接触WZ文件,但是却让我很震撼,为什么很震撼,因为这个居然是用VS2010写的! ...