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. Restore Volume 操作 - 每天5分钟玩转 OpenStack(60)

    前面我们 backup 了 voluem,今天我们将讨论如何 restore volume. restore 的过程其实很简单,两步走: 在存储节点上创建一个空白 volume. 将 backup 的 ...

  2. No zuo no die:DDD 应对具体业务场景,Domain Model 重新设计

    写在前面 上联:no zuo no die why you try 下联:no try no high give me five 横批: let it go上联:no zuo no die why y ...

  3. Android样式之selector

    日常开发当中,难免会出现这样一种情况,为一个按钮.TextView...设置一个点击状态的颜色改变,可能是background背景的改变,也可能是字体颜色的改变,简单点说:默认状态下,字体颜色或者背景 ...

  4. Java内存模型深度解析:重排序 --转

    原文地址:http://www.codeceo.com/article/java-memeory-2.html 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间 ...

  5. 使用Free Spire.Presentation生成PowerPoint文件

      使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...

  6. WebGIS开源方案中空间数据的入库、编辑、发布的操作流程

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 本开源方案的构架是:geoserver(服务器)+tomca ...

  7. 局部打印插件 jquery.PrintArea.js

    (function ($) { var printAreaCount = 0; $.fn.printArea = function () { var ele = $(this); var idPref ...

  8. jquery改变链接移上光标时的颜色实例

    效果体验http://hovertree.com/texiao/jquery/18/ 完整代码如下: <!DOCTYPE html> <html> <head> & ...

  9. (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

    ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念 ...

  10. 连接输出 如果存在在php中多次echo输出js的时候