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. IOS开发之新浪围脖

    IOS开发和Web开发一样,网络请求方式包括Get和Post方式.Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数据和POST数据.下面还会提到如何在我们的项 ...

  2. ASP.NET Web API 创建帮助页

    1. 安装 Microsoft.AspNet.WebApi.HelpPage 程序包 Install-Package Microsoft.AspNet.WebApi.HelpPage 2. 注册 Ar ...

  3. Java内存模型深度解析:基础部分--转

    原文地址:http://www.codeceo.com/article/java-memory-1.html 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何 ...

  4. MongoDB性能优化

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...

  5. 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

    前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...

  6. 如何在IIS添加MIME扩展类型

    在iis7中默认的MIME类型并不包含所有的后缀名文件,像现在比较热门的apk,ipa文件都是需要手动添加的. 那如何在IIS添加MIME类型?步骤如下: 1.打开iis7,选择你要设置网站,打开mi ...

  7. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

  8. ABP中使用Redis Cache(2)

    上一篇讲解了如何在ABP中使用Redis Cache,虽然能够正常的访问Redis,但是Redis里的信息无法同步更新.本文将讲解如何实现Redis Cache与实体同步更新.要实现数据的同步更新,我 ...

  9. 线程.FTP.SFTP.打包

    Windows就是多线程模式.每一个解决方案就是一个进程.一个进程下拥有多个线程. 简单点.单核的处理器不存在多线程.是CPU在每一个线程上切换处理.在人反应不过来的情况下完成同步的效果. 比如左手画 ...

  10. 《C#微信开发系列(4)-接收 / 返回文本消息》

    4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...