ViewGroup

dispatchTouchEvent onInterceptTouchEvent onTouch

View

dispatchTouchEvent onTouch

假设View的层级关系如下

<ViewGroup1>
<ViewGroup2>
<View/>
</ViewGroup2>
</ViewGroup1>
  • View事件传递顺序ACTION_DOWN

由最上层ViewGroup通过dispathcTouchEvent,如果事件没有被消费(dispatchTouchEvent return true),或者拦截(onInterceptTouchEvent return true),就会逐层传往下递到最底层View,如下所示

Activity.dispatchTouchEvent-->ViewGroup1.dispatchTouchEvent-->ViewGroup1.onInterceptTouchEvent-->ViewGroup2.dispatchTouchEvent-->ViewGroup2.onInterceptTouchEvent-->View.dispatchTouchEvent

如果事件没有被消费(onTouchEvent return true),会逐层往上调用onTouchEvent,如下所示

View.onTouchEvent()->ViewGroup1.onTouchEvent()->ViewGroup1.onTouchEvent()->Activity.onTouchEvent();

由于ACTION_DOWN事件没有被消费,说明下层View对点击事件没有兴趣,ACTION_MOVE事件不会再继续往下传递

如果事件被消费,比如设置onTouchListener或者onTouchEvent返回true,则事件不会往上传递,哪一层消费,再往上的onTouchEvent就不会被调用。而且底部的ViewGroup,View继续会接收之后传进来的ACTION_MOVE事件

  • requestDisallowInterceptTouchEvent(true)

如果子View在消费onTouch事件之后(比如ACTION_DOWN),调用getParent.requestDisallowInterceptTouchEvent(true),那么下一个ACTION_MOVE到来的时候,不会再调用View的父Group的onInterceptTouchEvent()方法

  即:子View没有调用requestDisallowInterceptTouchEvent(true); (onInterceptTouchEvent用OITE缩写,onTouchEvent用OTE缩写)

    VG1.OITE(ACTION_DOWN)->VG2.OITE(ACTION_DOWN)->VIEW.OTE(ACTION_DOWN) return true

如果子View在onTouchEvent里调用getParent().requestDisallowInterceptTouchEvent(true),则事件传递会变为如下(ACTION_DOWN事件之后会传来ACTION_MOVE)

    VG1.OITE(ACTION_MOVE)->VG2.OITE(ACTION_MOVE)->VIEW.OTE(ACTION_MOVE) return true(中间划横线表示这个方法没被调用了)

  注:dispatchTouchEvent会继续调用

  • 总结,

1.哪一层dispatchTouchEvent消费事件,事件就不会往下传,

2.哪一层消费onTouchEvent,事件onTouchEvent就不会再往上传

3.如果没有消费ACTION_DOWN,ACTION_MOVE不会像ACTION_DOWN一样,一层一层往下传,直接Activity.dispatchTouchEvent->Activity.onTouchEvent

相反,如果有消费ACTION_DOWN,ACTION_MOVE事件还是会像ACTION_DOWN一样,一层一层往下传,原理和ACTION_DOWN一样

即,如果消费了ACTION_DOWN,ACTION_MOVE才会传下来,如果消费了ACTION_MOVE,ACTION_UP事件才会传下来

不消费ACTION_DOWN,其他事件不会再传下来

												

Android View事件传递机制的更多相关文章

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

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

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

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

  3. Android touch 事件传递机制

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

  4. 【转】Android TouchEvent事件传递机制

    Android TouchEvent事件传递机制   事件机制参考地址: http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html ht ...

  5. Android Touch事件传递机制通俗讲解

    在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...

  6. 初识Android触摸事件传递机制

    前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...

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

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

  8. Android 的事件传递机制,详解

    Android 的事件传递机制,详解 前两天和一个朋友聊天的时候.然后说到事件传递机制.然后让我说的时候,忽然发现说的不是非常清楚,事实上Android 的事件传递机制也是知道一些,可是感觉自己知道的 ...

  9. Android Touch事件传递机制引发的血案

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38942135 关于Android Touch事件传递机制我之前也写过两篇文章,自觉得对Tou ...

随机推荐

  1. linux内核下载

    01最新版:https://www.kernel.org/ 02老旧版:https://www.kernel.org/pub/linux/kernel/v3.x/ ------------------ ...

  2. lightOJ 1326 Race(第二类Stirling数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1326 题意:有n匹马赛跑.问有多少种不同的排名结果.可以有多匹马的排名相同. 思路:排 ...

  3. 面试题_17_to_30_数据类型和 Java 基础面试问题

    17)Java 中应该使用什么数据类型来代表价格?(答案)如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型. 18)怎么将 byte 转换为 Stri ...

  4. 函数fsp_header_init

    /**********************************************************************//** Initializes the space he ...

  5. super.getClass()方法

    下面程序的输出结果是多少? importjava.util.Date; public class Test extends Date{ public static void main(String[] ...

  6. bzoj3272 3638

    好题,这道题可以用线段树来快速模拟费用流寻找最长增广路 这样修改怎么做也很显然了 type node=record s,lx,rx,mx,lp,rp,pb,pe:longint; end; ..*,. ...

  7. iOS开发:应用生命周期

    iOS应用通过委托对象AppDelegate类在应用周期的不同阶段会回调不同的方法,应用周期分为以下五种状态: Not Running(非运行状态).应用没有运行或被系统终止.   Inactive ...

  8. jquery datepicker-强大的日期控件

    在web开发中,总会遇到需要用户输入日期的情况.一般都是提供一个text类型的input供用户输入日期.然而,这种方式,开发人员必须对用户输入的日期进行验证,判断其合法性.除此之外,让用户输入日期也是 ...

  9. 使用D3D渲染YUV视频数据

    源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...

  10. handler.post 为什么要将thread对象post到handler中执行呢?

    转载网址:http://www.cnblogs.com/crazypebble/archive/2011/03/23/1991829.html在Android中使用Handler和Thread线程执行 ...