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. C# 对象与JSON串互相转换

    using System;using System.IO;using System.Text;using Newtonsoft.Json; namespace OfflineAcceptControl ...

  2. Delphi使用JSON解析调用淘宝IP地址库REST API 示例

    淘宝IP地址库:http://ip.taobao.com,里面有REST API 说明. Delphi XE 调试通过,关键代码如下: var IdHTTP: TIdHTTP; RequestURL: ...

  3. maximum-gap(经过了提示)

    下面的分桶个数做的不太好,原来的解法是用的 int gap = (big - small) / vlen; if (gap == 0) { gap = 1; } 下面是现在的Java解法: packa ...

  4. noi2002银河英雄传说(并查集)

    首先表示对C++读入读出问题复杂程度的敬畏,看了好多没讲明白的,本题用cin竟然过不了评测,搞scanf的读入搞了好久.... 本题确实是一道经典的并查集题型,不多讲,拿来练练手用的(其中经历很惨) ...

  5. UVa 11995 I Can Guess the Data Structure!

    做道水题凑凑题量,=_=||. 直接用STL里的queue.stack 和 priority_queue模拟就好了,看看取出的元素是否和输入中的相等,注意在此之前要判断一下是否非空. #include ...

  6. css垂直水平居中方案

    1. 水平居中 如果是inline元素:在父元素上面设置text-align:center; 如果是block元素:设置宽度和margin:0 auto; 如果是多块级元素:在父元素上面设置text- ...

  7. 【转】win7(windows7)下java环境变量配置方法

    原文网址:http://jingyan.baidu.com/article/925f8cb836b26ac0dde0569e.html win7(windows7)下java环境变量配置方法,java ...

  8. visual studio 2013 配置 ef+pgsql

    环境:VS2013,WIN7 准备工作: 1.有哪些供应商提供EF6的支持? 可以看msdn给出的答案:Which providers are available for EF6? 在本文使用 Dev ...

  9. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 get_selected_list_label(self, locator)

    def get_selected_list_label(self, locator): """Returns the visible label of the selec ...

  10. Asp.Net中文本换行

    Asp.Net中文本换行 VB.NET Function HtmlCode(ByVal fString)        If fString <> "" Then    ...