Android 根据规划 Touch 分配和消费机制的事件

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处理事件。假设还不消费该事件,那么事件就会向上回传,直到没有人处理这次事件,事件就会丢失。

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

时间: 2024-08-09 10:44:18

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

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

Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev).onTouchEvent(MotionEvent ev):能够响应这些方法的控件包括:ViewGroup 及其子类.Activity.方法与控件的对应关系如下表所示: Touch 事件相关方法   方法功能     ViewGroup         Activity        public b

Android touch 事件的分发和消费机制

Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev).onTouchEvent(MotionEvent ev):能够响应这些方法的控件包括:ViewGroup.View.Activity.方法与控件的对应关系如下表所示: Touch 事件相关方法   方法功能    ViewGroup           View             Activi

android中的事件分发和消费机制

一.思维导图 查看大图:http://img.blog.csdn.net/20150524191211931 二.更多参考 Android中的Touch事件处理:http://www.cnblogs.com/mengdd/p/3394345.html Android 编程下 Touch 事件的分发和消费机制 :http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html Android事件分发完全解析之为什么是她:http://blog

Android的事件分发与消费机制

一.Touch的三个重要方法 在Android中,与触摸事件也就是 Touch 相关的有三个重要方法,这三个方法共同完成触摸事件的分发. public boolean dispatchTouchEvent(MotionEvent ev) :事件分发 public boolean onInterceptTouchEvent(MotionEvent ev):事件拦截 public boolean onTouchEvent(MotionEvent ev):事件响应 下面就依次来分析这三个方法. 1.事

Touch 事件的分发和消费机制

Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev).onTouchEvent(MotionEvent ev):能够响应这些方法的控件包括:ViewGroup 及其子类.Activity.方法与控件的对应关系如下表所示: Touch 事件相关方法   方法功能     ViewGroup         Activity        public b

从Android源码的角度分析Binder机制

IPC 为了弄懂IPC的来龙去脉,我将从以下三个方面为大家来讲解,希望对大家理解IPC会有帮助 什么是IPC IPC是Inter Process Communication的缩写,其意思就是进程间的通信,也就是两个进程之间的通信过程.我们都知道在Android系统中,每个应用都运行在一个进程上,具有自己的DVM实例,而且进程之间是相互隔离的,也就是说各个进程之间的数据是互相独立,互不影响的,而如果一个进程崩溃了,也不会影响到另一个进程.采取这样的设计是有一定道理的,例如这样的前提下将互相不影响的

第四讲 社会主义初级阶段的分配与消费

第四讲  社会主义初级阶段的分配与消费1 <马克思主义与改革>(经济学篇) 第一节  我国国民收入的分配 一.社会总产值和国民收入 社会总产值是指我国一年内由物质生产部门劳动者生产出来的社会总产品的总价值.全国在一年中生产的物质资料,表现为实物形式和价值形式.从实物上称为社会总产品,它分为生产资料和消费资料两部分:从价值上称为社会总产值,它分为生产中消耗的生产资料旧价值和劳动者创造的新价值.其中新价值又分为两部分,一是劳动力价值即劳动者报酬,二是剩余价值即经营利润. 国民收入是社会总产值的一部

android中根据touch事件判断单击及双击

private static final int MAX_INTERVAL_FOR_CLICK = 250;     private static final int MAX_DISTANCE_FOR_CLICK = 100;     private static final int MAX_DOUBLE_CLICK_INTERVAL = 500;     int mDownX = 0;     int mDownY = 0;     int mTempX = 0;     int mTempY

Android总结的基本机制监控事件

研究上午Android底层机制事件监视器,例如下面的摘要: 内核驱动监控硬件状态和行为,由uevent机制将事件发送到用户空间: 通过用户空间UeventObserver从内核监控uevent,处理. 间的通信使用了netlink机制. 參考的文章有: Android使用UeventObserver: http://blog.csdn.net/lushengchu_luis/article/details/9466405 http://blog.csdn.net/dfysy/article/de