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. Galaxy (hdu 5073 数学)

    Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total S ...

  2. Outlook将收到邮件的附件保存在磁盘

    1. 新建一个宏 1)文件->选项->自定义功能区, 把主选项卡的 开发工具勾选上. 2)开发工具->宏,输入宏名,创建. 加入以下代码 Public Sub SaveAttach( ...

  3. Java EE (4) -- Java EE 6 Java Persistence API Developer Certified Expert(1z0-898)

    Overview of the Java Persistence API Describe the basics of Object Relational Mapping (ORM) Define t ...

  4. Hibernate Tomcat JNDI数据源配置(转)

    简述: 配置JNDI 查找Tomcat 中server.xml中定义的数据源 步骤: 1. 修改elipse的数据源server.xml 主要修改如下, 1. 添加下面这段Context文本 其中St ...

  5. Java 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families ...

  6. WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体

    原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...

  7. C#实现远程机器管理

    原文:C#实现远程机器管理 目前处于待离职状态,原先所有的工作都在进行交接,过程当中不乏有很多先前整理的和动手尝试实现的功能:我的主页中已经列出来一部分内容,有兴趣的可以前往看一看. 接下来的内容主要 ...

  8. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  9. RH033读书笔记(7)-Lab 8 Introduction to String Processing

    Lab 8 Introduction to String Processing Sequence 1: Exercises in string processing 1. Other than the ...

  10. android_定义多个Activity及跳转

    说明:在Android应用程序其中创建多个activity,而且启动一个activity的方法,以及activity之间的跳转. 样例:在MainActivity里面加入一个button,触动butt ...