Android 中与 Touch 事件相关的方法包含:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent
ev)、onTouchEvent(MotionEvent ev);可以响应这些方法的控件包含:ViewGroup、View、Activity。方法与控件的相应关系例如以下表所看到的:

Touch 事件相关方法   方法功能  
  ViewGroup  
       View       
     Activity     
  public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 
 Yes  Yes  Yes
  public boolean onInterceptTouchEvent(MotionEvent ev) 
事件拦截 
 Yes  Yes  No
  public boolean onTouchEvent(MotionEvent ev) 事件响应 
 Yes  Yes  Yes
  • 假设 return
    true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费。同一时候事件会停止向下传递。
  • 假设 return
    false。事件分发分为两种情况:
  1. 假设当前 View 获取的事件直接来自 Activity。则会将事件返回给 Activity 的 onTouchEvent 进行消费;
  1. 假设当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的  onTouchEvent 进行消费。

  • 假设返回系统默认的 super.dispatchTouchEvent(ev)。事件会自己主动的分发给当前
    View 的 onInterceptTouchEvent 方法。

  • 假设 onInterceptTouchEvent 返回 true,则表示将事件进行拦截。并将拦截到的事件交由当前
    View 的 onTouchEvent 进行处理;
  • 假设 onInterceptTouchEvent 返回 false,则表示将事件放行,当前
    View 上的事件会被传递到子 View 上。再由子 View 的 dispatchTouchEvent 来開始这个事件的分发;
  • 假设 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前
    View 的 onTouchEvent 进行处理。
  • 假设事件传递到当前 View 的 onTouchEvent 方法。而该方法返回了 false。那么这个事件会从当前 View 向上传递。而且都是由上层 View 的 onTouchEvent 来接收,假设传递到上面的
    onTouchEvent 也返回 false,这个事件就会“消失”,并且接收不到下一次事件。
  • 假设返回了 true 则会接收并消费该事件。
  • 假设返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时同样。

从这张表中我们能够看到 ViewGroup 和 View 对与 Touch 事件相关的三个方法均能响应,而 Activity 对 onInterceptTouchEvent(MotionEvent
ev) 也就是事件拦截不进行响应。

另外须要注意的是 View 对 dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent
ev) 的响应的前提是能够向该 View 中加入子 View,假设当前的 View 已经是一个最小的单元 View(比方 TextView),那么就无法向这个最小 View 中加入子 View,也就无法向子 View 进行事件的分发和拦截。所以它没有dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent
ev),仅仅有 onTouchEvent(MotionEvent ev)。

一、Touch 事件分析

▐ 事件分发:public
boolean dispatchTouchEvent(MotionEvent ev)

Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中因为某一条件停止传递)将事件传递给最外层
View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。

dispatchTouchEvent 的事件分发逻辑例如以下:

▐ 事件拦截:public
boolean onInterceptTouchEvent(MotionEvent ev)

在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下。事件会自己主动的分发给当前
View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑例如以下:

▐ 事件响应:public
boolean onTouchEvent(MotionEvent ev)

在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 而且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。

onTouchEvent 的事件响应逻辑例如以下:

通过以下的图能够清楚的看到事件整个传递的过程(布局为viewGroup1在最外层,里面嵌套一个viewGroup2。viewGroup2里面加入了一个Button)。

从下图也能够看出,事件会最先被最外层的布局(viewGroup1)给对应。然后依次向内层(viewGroup2)传递,当传递到最内层的View (Button)。假设View已经是一个最小单元时,那么就会交给View的onTouchEvent处理事件。假设还不消费该事件,那么事件就会向上回传,直到没有人处理这次事件,事件就会丢失。

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android 根据规划 Touch 分配和消费机制的事件的更多相关文章

  1. Android事件分发机制(一) Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  2. Android 编程下 Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  3. Android 编程下Touch 事件的分发和消费机制和OnTouchListener,OnClickListener和OnLongClickListener的关系

    1.事件分发:public boolean dispatchTouchEvent(MotionEvent ev) Touch 事件发生时 Activity 的 dispatchTouchEvent(M ...

  4. Android 编程下Touch 事件的分发和消费机制

    1.事件分发:public boolean dispatchTouchEvent(MotionEvent ev) Touch 事件发生时 Activity 的 dispatchTouchEvent(M ...

  5. 通俗理解Android事件分发与消费机制

    深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...

  6. Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  7. 事件之Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  8. touch事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  9. Android事件分发和消费机制(转载)

    原文链接:http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html Android 中与 Touch 事件相关的方法包括:dispatc ...

随机推荐

  1. 用户手册User Guide的写法

    下面的内容仅代表个人观点,是在工作中总结出来的,如果有错误之处,还请指教. 转载请注明来自博客园---”邦邦酱好“: http://www.cnblogs.com/bangbangjiang/p/36 ...

  2. Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程

    原文:Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程 Red Gate系列之一 SQL Compare 10.4.8.87 E ...

  3. Visual C++学习笔记1:一定要注意ANSI和UNICODE差额

    最近的研究VC++.下载VS2013,根据<Visual C++开发实战系列>首先hello我写了一个常规样品,结果显示乱码编辑框.夜已经折腾型转变.然后总结很明显ANSI和UNICODE ...

  4. FPGA开机状态

    最近调试FPGA电路时发现一个问题,我从来没有注意过.我们都知道Xilinx的FPGA有三种功率M引脚,这是为了让我们配置三个引脚FPGA装载机模式,什么是主要的字符串.从字符串.并行等.,该手册有. ...

  5. Java、PHP训练场地选择成都传祺播客

    传智播客选择九类基础: 1 有不怕炫耀实力,我们会爱一本书,是一个开源项目 2 领先的新技术,让我们的学生走在别人前面,首先推出Hadoop.Unity3D.Nginx. 3 课程广博的知识,深入的技 ...

  6. Ubuntu下搭建ASP.NET 5

    在Ubuntu下搭建ASP.NET 5开发环境   0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要 ...

  7. JNI 可变印刷

    1.包log.h #ifndef __MULTI_TRACE_H__ #define __MULTI_TRACE_H__ #ifdef ANDROID_NDK_BUILD #define LOG_TA ...

  8. DataGridView显示数据的两种方法

    1.简介 DataGridView空间是我们经常使用的显示数据的控件,它有极高的可配置性和可扩展性. 2.显示数据 DataGridView显示数据一般我们经常使用的有两种方法,一种是直接设置Data ...

  9. WebAPI 15 CORS

    WebAPI 15 CORS 同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 对于同源必须要求URL在如下几个方 ...

  10. MaidSafe.net,一个完全去中心的化的云存储系统

    MaidSafe.net,一个完全去中心的化的云存储系统 (类似Bitcloud系统) 本帖最后由 tbit 于 2014-3-26 16:11 编辑 已经开发了8年,最近即将推出测试和IPO.开放源 ...