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. Android权限安全(9)Android权限特点及权限管理服务AppOps Service

    Android权限特点 权限管理服务AppOps Service 图中元素介绍: Ignore 是不提示的,Allow 是允许,Reject 是拒绝 Client是一个使用sms 的应用, AppOp ...

  2. C#编写媒体播放器--Microsoft的Directx提供的DirectShow组件,该组件的程序集QuartzTypeLib.dll.

    使用C#编写媒体播放器时,需要用到Microsoft的Directx提供的DirectShow组件.用该组件前需要先注册程序集QuartzTypeLib.dll. 1.用QuartzTypeLib.d ...

  3. bash shell 合并文件

    # 按列合并文件 paste file1 file2 file3 > file4 # 要先 sort, 再 file1 file2 paste格式为: paste -d -s -file1 fi ...

  4. servlet应用具体实例

    web,xml应用文件 1.<filter>参数 <filter> <filter-name>encodingFilter</filter-name> ...

  5. POJ 2947 Widget Factory (高斯消元 判多解 无解 和解集 模7情况)

    题目链接 题意: 公司被吞并,老员工几乎全部被炒鱿鱼.一共有n种不同的工具,编号1-N(代码中是0—N-1), 每种工具的加工时间为3—9天 ,但是现在老员工不在我们不知道每种工具的加工时间,庆幸的是 ...

  6. I.MX6 开启 1000Mb/s interface

    /*********************************************************************** * I.MX6 开启 1000Mb/s interfa ...

  7. 省常中模拟 Test4

    prime 数论 题意:分别求 1*n.2*n.3*n.... n*n 关于模 p 的逆元.p 是质数,n < p. 初步解法:暴力枚举.因为 a 关于模 p 的逆元 b 满足 ab mod p ...

  8. 使用源代码安装lnmp

    一.安装nginx前,安装pcre. # tar zxvf pcre-8.12.tar.gz# ./configure# make# make install 二.安装nginx # tar zxvf ...

  9. ECshop 每个数据库表结构说明

    ecs_account_log // 用户账目日志表 ecs_activity // 活动表(代码,名称,开始,结束,描述) ecs_ad // 广告表(位置,类型,名称,链接,图片,开始,结束,广告 ...

  10. HDU 2056 Rectangles

    Rectangles Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...