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. 简述负载均衡&CDN技术(转)

    曾经见到知乎上有人问“为什么像facebook这类的网站需要上千个工程师维护?”,下面的回答多种多样,但总结起来就是:一个高性能的web系统需要从无数个角度去考虑他,大到服务器的布局,小到软件中某个文 ...

  2. HDU4309-Seikimatsu Occult Tonneru(最大流)

    Seikimatsu Occult Tonneru Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  3. 小米2S TWRP 3.0.2-0 最新中文版本Recovery

    注意:此版本为合并分区后的twrp  小米2S 合并分区教程:http://forum.xda-developers.com/mi-2/orig-development/flashtools-mifl ...

  4. Android 调试native的crash和anr

    1. 于trace找到相应的库.例如 liba.so和相应的地址信息 2. 采用addr2line 查看 addr2line 住址 -e liba.so -f 要么 arm-eabi-addr2lin ...

  5. Oracle Instanc Client安装命令工具

    条件 1.Linux RHEL 6.X X86_64操作系统 2.从安装Oracleserver的server此次收购Oracle相关文件(同OS) 软件下载 从Oracle包: 1)  instan ...

  6. Directx11学习笔记【十六】 光照模型的实现

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5579289.html 在之前的场景绘制中我们都是给每个顶点指定了单 ...

  7. oracle 转让日期格式字符串

    字符串传递日期格式 SELECT trunc(to_date(SALE_MON,'yyyy-mm'),'y'),trunc(to_date(SALE_MON,'yyyy-mm'),'mm')  FRO ...

  8. Chrome console(转)

    阅读目录 写在前面 谷歌控制台Elements面板 查看元素上绑定的事情 样式操作 总况 console.log console.info console.error console.warn con ...

  9. Windows8.1和Ubuntu14.04双系统卸载Ubuntu參考教程[图]

    我之前编写并公布了<Windows8.1安装Ubuntu14.04双系统參考教程及双硬盘注意事项>这篇教程,而本文提供的卸载Ubuntu方法适用于这篇教程,其它方法安装的Ubuntu可适当 ...

  10. LeetCodeOJ. Longest Common Prefix

    试题请參见: https://oj.leetcode.com/problems/longest-common-prefix/ 题目概述 Write a function to find the lon ...