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. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  2. 再见,CSDN

    这是第三次的博客, 首先是从百度改变自己 从他的变化二CSDN 看看多年的积累, 真的不想,但CSDN搜电缆和编辑(新MarkDown更烂)实在不敢恭维 再见CSDN, 新的博客 http://my. ...

  3. java.lang.OutOfMemoryError: Java heap space错误和方法(集、转)

    错误的方式来解决溢出下面的堆空间是从网上找: java.lang.OutOfMemoryError: Java heap space ================================= ...

  4. easyui LinkButton

    http://www.zi-han.net/case/easyui/menu&button.html

  5. Windows 8 应用开发 - 磁贴

    原文:Windows 8 应用开发 - 磁贴      我们开发的应用在Win8 界面中会以磁贴形式展现,默认情况下磁贴会显示应用图标,即项目工程中的Logo.png图片文件.开发人员可按应用的需要使 ...

  6. win8.1 64位环境建设android开发环境

    1.下载JDK,http://www.oracle.com/technetwork/java/javase/downloads/index.html,选择版本号 2.安装刚刚下载的JDK 3.环境变量 ...

  7. Source Insight 光标变粗设置NotePad++光标设置

    为了更好的查看文档和代码,避免半天都找不到光标的情况,故做此说明 Source Insight 光标变粗 菜单中 Options --->Preferences --->Typing -- ...

  8. Gmail POP3设定

    好几个同事在问我怎样使用ThunderBird和OE收取IT CHT的邮箱,因为IT CHT就是用Gmail的功能,因此收发邮件是跟Gmail一样,下面是Gmail的POP&SMTP的设置方法 ...

  9. 《深入了解mybatis原则》 MyBatis架构设计和案例研究

    MyBatis这是现在很流行ORM框架,这是非常强大.事实上现却比較简单.优雅. 本文主要讲述MyBatis的架构设计思路,而且讨论MyBatis的几个核心部件.然后结合一个select查询实例.深入 ...

  10. [视频解说]0基础课程-运营商-Java它J2se

    本节解说 运营商应用 Java 算被分成: 算术运算符 颂值运营商 逻辑运算符 位运算符 元运算符 这里录制了 视频解说这几大类运算符,并有练习题提供大家 面试题: 1. 最有效率的方式算出2乘以8等 ...