【Android 事件分发】MotionEvent.ACTION_DOWN 按下事件分发流程( Activity | ViewGroup | View )

article/2025/9/14 13:06:40

Android 事件分发 系列文章目录


【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 )
【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 一 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 二 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 三 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 四 | View 事件传递机制 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )
【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )

【Android 事件分发】ItemTouchHelper 简介 ( 拖动/滑动事件 | ItemTouchHelper.Callback 回调 )
【Android 事件分发】ItemTouchHelper 实现侧滑删除 ( 设置滑动方向 | 启用滑动操作 | 滑动距离判定 | 滑动速度判定 | 设置动画时间 | 设置侧滑触发操作 )
【Android 事件分发】ItemTouchHelper 实现拖动排序 ( 设置滑动方向 | 启启用长按拖动功能 | 拖动距离判定 | 设置拖动触发操作 )

【Android 事件分发】ItemTouchHelper 事件分发源码分析 ( 绑定 RecyclerView )
【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )
【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

【Android 事件分发】MotionEvent.ACTION_DOWN 按下事件分发流程( Activity | ViewGroup | View )


文章目录

  • Android 事件分发 系列文章目录
  • 一、事件分发相关类和方法
  • 二、Activity 的事件传递
    • 1、Activity.dispatchTouchEvent 方法事件传递机制
    • 2、Activity.onTouchEvent 方法事件传递机制
  • 三、ViewGroup 的事件传递
    • 1、ViewGroup.dispatchTouchEvent 方法事件传递机制
    • 2、ViewGroup.onInterceptTouchEvent 方法事件传递机制
    • 3、ViewGroup.onTouchEvent 方法事件传递机制
  • 四、View 的事件传递
    • 1、View .dispatchTouchEvent 方法事件传递机制
    • 2、View .onTouchEvent 方法事件传递机制
  • 五、事件分发示意图
  • 总结





一、事件分发相关类和方法



Android 事件分发涉及到的类有 3 3 3 个 , Activity , ViewGroup , View ;

Android 事件分发涉及到的如下 7 7 7 个方法 :

  • Activity 类涉及到 dispatchTouchEvent , onTouchEvent , 2 2 2 个方法 ;
public class MainActivity extends AppCompatActivity {@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}
}
  • ViewGroup 涉及到 dispatchTouchEvent , onInterceptTouchEvent , onTouchEvent , 3 3 3 个方法 ;
public class MyConstraintLayout extends ConstraintLayout {@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}
}
  • View 涉及到 dispatchTouchEvent , onTouchEvent , 2 2 2 个方法 ;
public class MyButton extends androidx.appcompat.widget.AppCompatButton {@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {return super.dispatchTouchEvent(event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}
}




二、Activity 的事件传递




1、Activity.dispatchTouchEvent 方法事件传递机制


事件来源 :

① 驱动层产生触摸事件, 由 WindowManagerService 传递到 Activity


事件分发 :

① 停止传递 : 如果返回 true / false , 说明事件被消费 , 停止传递

② 继续传递 : 如果返回 super.dispatchTouchEvent(ev) , 那么继续向下传递, 按照如下顺序逐层传递 : Activity -> PhoneWindow -> DecorView -> ViewGrope , 最终传递到 ViewGroup, 调用 ViewGroup 的 dispatchTouchEvent 方法

    /*** 该方法是页面事件分发入口** 针对 ACTION_DOWN 事件分析 :*  事件来源 :*      驱动层产生触摸事件, 由 WindowManagerService 传递到 Activity*  事件分发 :*      如果返回 true / false, 说明事件被消费, 停止传递*      如果返回 super.dispatchTouchEvent(ev), 那么继续向下传递, 按照如下顺序逐层传递 :*          Activity -> PhoneWindow -> DecorView -> ViewGrope*          最终传递到 ViewGroup, 调用 ViewGroup 的 dispatchTouchEvent 方法** @param ev* @return*/@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}

2、Activity.onTouchEvent 方法事件传递机制


事件来源 :

① 布局容器 ViewGroup 的 dispatchTouchEvent 方法返回 false ;

② 布局容器 ViewGroup 的 onTouchEvent 方法返回 false / super.onTouchEvent(event) ;


事件分发 : 这是事件传递的终点, 返回值无所谓

① 返回 true 说明事件被消费了 ;

    /*** 针对 ACTION_DOWN 事件分析 :*  事件来源 :*      布局容器 ViewGroup 的 dispatchTouchEvent 方法返回 false*      布局容器 ViewGroup 的 onTouchEvent 方法返回 false / super.onTouchEvent(event)*   事件分发 : 这是事件传递的终点, 返回值无所谓*      返回 true 说明事件被消费了** @param event* @return*/@Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}




三、ViewGroup 的事件传递




1、ViewGroup.dispatchTouchEvent 方法事件传递机制


    /*** 针对 ACTION_DOWN 事件分析 :*  事件来源 :*      从 Activity 的 dispatchTouchEvent 传递而来*      从父容器 ViewGroup 的 dispatchTouchEvent 传递而来*  事件分发 :*      如果返回 true, 表示事件被消费, 停止传递*      如果返回 false, 则传递给父控件的 onTouchEvent 方法*      如果返回 super.dispatchTouchEvent(ev) , 则继续向下传递到 onInterceptTouchEvent 方法** @param ev* @return*/@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}

2、ViewGroup.onInterceptTouchEvent 方法事件传递机制


    /*** 针对 ACTION_DOWN 事件分析 :*  事件来源 :*      从 本类 的 dispatchTouchEvent 方法传递而来*  事件分发 :*      返回 true, 则停止向后传递, 执行本类的 onTouchEvent 方法*          如果需要拦截, 返回true*      返回 false / super.onInterceptTouchEvent(ev),*          则继续向 子容器/子组件 的 dispatchTouchEvent 方法传递; ( 这里是子组件 )*          默认不拦截** @param ev* @return*/@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return super.onInterceptTouchEvent(ev);}

3、ViewGroup.onTouchEvent 方法事件传递机制


    /*** 针对 ACTION_DOWN 事件分析 :*  事件来源 :*      本类的 onInterceptTouchEvent 方法返回 true*      子组件/子容器 的 dispatchTouchEvent 方法返回 false*      子组件/子容器 的 onTouchEvent 方法返回 false / super.onTouchEvent(event)*   事件分发 :*      返回 true 说明事件被消费了, 不再向下传递*      返回 false / super.onTouchEvent(event) , 则需要继续向下传递*          向父容器的 onTouchEvent 传递*** @param event* @return*/@Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}




四、View 的事件传递




1、View .dispatchTouchEvent 方法事件传递机制


    /*** 针对 ACTION_DOWN 事件分析 :*  事件来源 :*      父容器 ViewGroup 的 onInterceptTouchEvent 如果返回 false / super.onInterceptTouchEvent(ev)*          将事件传递到该方法*  事件分发 :*      如果返回 true, 表示事件被消费, 停止传递*      如果返回 false, 则传递给父控件的 onTouchEvent 方法*      如果返回 super.dispatchTouchEvent(ev) , 则向本类的 onTouchEvent 方法传递** @param event* @return*/@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {return super.dispatchTouchEvent(event);}

2、View .onTouchEvent 方法事件传递机制


    /*** 针对 ACTION_DOWN 事件分析 :*  事件来源 :*      本类的 dispatchTouchEvent 方法返回 super.dispatchTouchEvent(event)*   事件分发 :*      返回 true 说明事件被消费了, 不再向下传递*      返回 false / super.onTouchEvent(event) , 则需要继续向下传递*          向父容器的 onTouchEvent 传递*** @param event* @return*/@Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}




五、事件分发示意图



网上找了两张示意图 , 参考上述源码注释理解 ;

在这里插入图片描述

在这里插入图片描述





总结



通过控制上述 7 7 7 个方法的 3 3 3 种返回值 true / false / super , 控制整体 Activity 界面组件的事件分发 ;


事件分发规律 :

① 事件消费 : dispatchTouchEvent 或 onTouchEvent , 一旦返回 true , 则标明事件消费 , 不再继续分发事件 ; 注意 : Activity 的 dispatchTouchEvent 除外 , 其返回 true / false 都表示事件已消费 , 只有 super 时才向下传递 ;

② 向父容器传递 : dispatchTouchEvent 或 onTouchEvent , 一旦返回 false , 一律将事件传递给父容器的 onTouchEvent 方法 ;

③ 事件拦截 : onInterceptTouchEvent 返回 true , 则执行自己的 , 返回 false 则传递到子组件的 dispatchTouchEvent 方法 ;


http://chatgpt.dhexx.cn/article/5oB4jYgg.shtml

相关文章

Android MotionEvent详解

在前边几篇博文中(《图解Android事件传递之ViewGroup篇》,《图解Android事件传递之View篇》),我们已经了解了android触摸事件传递机制,接着我们再来研究一下与触摸事件传递相关的几个比较重要的类,比如Moti…

[Android Input系统]MotionEvent的序列化传送

这里从云游戏的触控操作看起, PC端的客户端支持按键和鼠标滑动操作,手机上的云游戏客户端则是和手机游戏一样的touch触控,客户端的touch操作是怎样处理给服务端的呢,猜测是把touch操作“实时”的传送给了服务器,Androi…

Android MotionEvent 坐标获取

Android MotionEvent中getX()与getRawX()都是获取屏幕坐标(横),但二者又有区别 getX() : 是获取相对当前控件(View)的坐标 getRawX() : 是获取相对显示屏幕左上角的坐标 演示…

Android事件拦截(一)——触摸事件MotionEvent分析

(1)MotionEvent相关动作事件 //按下动作 public static final int ACTION_DOWN 0; //抬起动作 public static final int ACTION_UP 1; //移动动作 public static final int ACTION_MOVE 2; //触摸取消动作 public static final int ACTION_CANCEL 3…

Android MotionEvent

1.MotionEvent Android将所有的输入事件都放在了 MotionEvent 中,MotionEvent 负责集中处理所有类型设备的输入事件,包括单点触控、手势、多点触控、触控笔、鼠标、键盘、操纵杆、游戏控制器等。 事件类型: MotionEvent的事件类型主要有&…

[Android]视图的控触操作-MotionEvent

引入 对屏幕的任何操作,系统都会创建一个触摸事件的对象MotionEvent来应对这个操作。当点击手机屏幕的某一个视图时,最先感应到的是屏幕,因为Activity系统是分层的结构,底层是一些驱动,所以驱动就会得到信息并且把信息…

MotionEvent 详解

Android MotionEvent详解: https://www.jianshu.com/p/0c863bbde8eb https://www.diycode.cc/topics/392 Android 将所有的输入事件都放在了 MotionEvent 中,随着安卓的不断发展壮大,MotionEvent 也开始变得越来越复杂,下面是我自己整理的 …

MotionLayout MotionScene 动画从未如此简单!

话不多说先上图。 这是要做的最终效果。通过这些动画我们将了解MotionLayout的使用方法和常用的一些属性。 第一步:添加依赖 如果要使用MotionLayout请将ConstraintLayout更新到2.0及以上。在build.gradle文件中添加依赖 如果使用的是AndroidX,添加依赖…

Android的MotionEvent和事件处理

之前几篇文章我们讲解了自定义View和ViewGroup, 今天我们来看下View和ViewGroup常见的触摸事件和按键事件。 MotionEvent MotionEvent对象是与用户触摸相关的时间序列,该序列从用户首次触摸屏幕开始,经历手指在屏幕表面的任何移动,直到手指…

MotionEvent详解

Android MotionEvent 详解,之前用了两篇文章 事件分发机制原理 和 事件分发机制详解 来讲解事件分发,而作为事件分发主角之一的 MotionEvent 并没有过多的说明,本文就带大家了解 MotionEvent 的相关内容,简要介绍触摸事件&#xf…

Android自定义View进阶-MotionEvent详解

欢迎Follow我的GitHub, 关注我的CSDN. 其余参考Android目录 我们微信公众号:杨守乐 推荐文章: 如果你喜欢上了一个程序员小伙,献给所有的程序员女友 学习资料(干货汇集)不断更新【更新于2017-2-25】 Android Studi…

常用awk命令整理

AWK倾向于一行一行的数据进行处理 awk 用法:awk pattern {action} 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符,默认为一个空格 RS 输入记录分隔符 NF 当…

sed命令和awk命令

sed命令 sed命令■什么是sed■sed的工作流程■命令格式■常用选项:■常用操作:■打印内容■sed编辑器的寻址方式■删除行■替换■插入 awk命令■awk命令的工作原理■命令格式■常见的内建变量■按行输出文本■按字段输出文本:■通过管道、双引号调用Shell 命令■拓展 sed命令 …

awk命令应用

记录:353 场景:在CentOS 7.9操作系统上,使用awk文本处理工具处理文本;使用awk、cat和grep搭配使用处理文本;使用awk直接处理文本;使用shell脚本调用awk脚本处理文本。 版本: 操作系统&#x…

概要设计之功能模块

功能模块描述 所谓功能模块,从字面上理解,就是以功能来进行划分模块。 接着,根据功能特性多少,决定是否要划分“子功能模块”。 这里就容易出现一个问题,如何去确定每个功能的界限呢,以及很多人会拿用户角…

系统架构图编写(概要设计)

系统架构图编写(概要设计) 应用架构图、技术架构图、业务架构图定义以及到底怎么画好架构图? 常见的数据库架构设计方案? 业务架构的定义、特性和方法 架构图之间的关系 业务架构图 业务架构,是IT架构的基础。 是从业…

概要设计、详细设计:概念、方法、实践步骤

完整软件开发流程: 需求分析、概要设计、详细设计 一 1. 概念、方法、实践步骤 设计是指根据需求开发的结果,对产品的技术实现由粗到细进行设计的过程。根据设计粒度和目的的不同可以将设计分为概要设计、详细设计等阶段以便于管理和确保质量。设计内容…

概要设计与详细设计如何编写

撰写的设计文档主要分为:总体概要设计文档 详细设计文档,后简称为“概设”“详设”。 总设和详设都应该包含的部分: (1) 需求:一般以产品的语言描述,这一块可以拷贝产品需求文档中的story li…

软件项目总体设计

软件项目总体设计 目录 1.导言 1 1.1目的 1 1.2范围 1 1.3参考资料 2 2.项目设计原则简介 2 3.功能模块设计 2 3.1功能模块设计总述 2 3.2 客户端子系统模块设计 4 3.2.1 模块 CM1 :静态页面 4 3.2.2 模块 CM2:系统登录 5 3.2.3 模块 CM3 :注…

软件概要设计的过程与任务

在完成对软件系统的需求分析之后,接下来需要进行的是软件系统的概要设计。一般说来,对于较大规模的软件项目,软件设计往往被分成两个阶段进行。首先是前期概要设计,用于确定软件系统的基本框架;然后是在概要设计基础上…