Android中触摸事件传递分发机制

Android11/Android Q分屏功能实现 android分屏功能 阅读详情

触摸事件用MotionEvent表示,在Android中,一个触摸事件从产生到最终起作用,是一个很复杂的过程,但思路还是很清晰的,就是一层一层的传递,通过一个boolean值判断是否拦截或者消耗(也就是使用掉这个事件)。下面从基础的事件产生过程开始梳理整个流程:

事件的类型:

一般使用手机,在屏幕上的操作就是点击或滑动,所以一般触摸事件分为两类:

  • 点击事件:ACTION_DOWN–>ACTION_UP
  • 滑动事件:ACTION_DOWN–>ACTION_MOVE–>ACTION_MOVE … … –>ACTION_UP

可以看到,事件的开始都是ACTION_DOWN,结束是ACTION_UP。滑动事件相比点击事件,多了n个ACTION_MOVE事件,也就是滑动过程中手指与屏幕的交互,其他就没什么区别了。

事件的传递过程:

在Android中,Activity作为界面显示的基础,通常用来接收触摸事件,然后分发给界面中的视图控件。当一个触摸事件产生时,最先传递给当前Activity,然后由Activity内部的Window将事件传递给DecorView(也就是当前屏幕显示的界面的底层容器)接下来就是在开发者编写的ViewGroup和View中传递了,所以整理下事件传递过程如下图:
这里写图片描述

从图中可以看到,由于DecorView继承自FrameLayout,所以它是一个ViewGroup,ContentView也是一个ViewGroup,因此,整个传递过程可以简化为三个步骤:

Activity—->ViewGroup…—->View

也就是从Activity传递到ViewGroup,再经过n步的ViewGroup之间传递,最终传递给View。

事件传递的代码实现:

将以上传递规则通过代码实现,主要涉及到以下三个方法:

  • dispatchTouchEvent():分发触摸事件,默认返回super.dispatchTouchEvent(ev),事件向上分发。(一般,在这个方法中会有命中测试,也就是判断点击的坐标在当前viewGroup的哪个子布局中,然后将事件分发给对应的子布局)

  • onInterceptTouchEvent():拦截触摸事件,默认返回false,表示不拦截事件

  • onTouchEvent():处理触摸事件,默认返回false,表示不消耗事件

在Activity中存在两个回调方法:

public boolean dispatchTouchEvent(MotionEvent ev);    
public boolean onTouchEvent(MotionEvent ev); 

在ViewGroup中存在三个回调方法:

public boolean dispatchTouchEvent(MotionEvent ev);    
public boolean onInterceptTouchEvent(MotionEvent ev);    
public boolean onTouchEvent(MotionEvent ev);  

在View中存在两个回调方法:

public boolean dispatchTouchEvent(MotionEvent ev);    
public boolean onTouchEvent(MotionEvent ev); 

可以看到,以上三个方法的返回值类型都是boolean类型,正如前面所说,在事件的传递过程中,通过boolean值判断是否拦截或者消耗,因此,有必要搞明白这三个方法的不同返回值的意义。

接下来通过测试代码加图解的方式来说明这三个方法的工作流程以及一些返回值的意义

点击View时的事件传递

一个自定义的ViewGroup,里面有一个自定义View,都是通过重写上述三个方法,用logcat跟踪事件流向,整个界面布局中只有这一个ViewGroup和其中的view,在MaintActivity中给他们都设置了onTouchListener,代码很简单,所以就不贴出来了。

下面是当View的onTouch返回false时,运行的logcat:

这里写图片描述

然后是根据运行情况,画的一个简单的流程图:

这里写图片描述

接下来是当View的onTouch返回true时,运行的logcat:

这里写图片描述

然后是流程图:

这里写图片描述

通过以上对比可以得出结论:

  • view的onTouchEvent返回值为false时,这个事件会往底层传由其父ViewGroup的onTouchEvent处理,直到某一层父ViewGroup的onTouchEvent返回true,如果传到顶层view依然返回false,则这个事件会消失,后续的事件序列也不会再被传递

  • view的onTouchEvent返回值为true,则这个view消耗此事件,后续事件序列也将交给这个view处理

以上,关于View的触摸事件传递,就先分析到这里

参考资料:
http://blog.youkuaiyun.com/xyz_lmn/article/details/12517911

http://www.eoeandroid.com/thread-319301-1-1.html

http://blog.youkuaiyun.com/qiushuiqifei/article/details/9918527

Android源码分析——ViewGroup的事件分发机制(二) 通过前一篇博客View的事件分发机制,从dispatchTouchEvent说起(一)的介绍相信大家对 Android View 事件的分发机制有了很深的理解。我们知道 Android 中 View 是存在于 Activity。 今天我们继续学习 Activity 到 ViewGroup 的事件分发机制。 一、Activity 分发到 ViewGroup 当我们手指触摸到屏幕时,最先接收到事件的... 阅读详情

相关推荐

android实现双屏异显异触

超实用的异显异触说明,实现双屏,还有异触摸功能,支持下

android framework高级开发-多屏异显触摸Presentation相关实战demo

hi,各位粉丝朋友大家好! 近来有同学问到对于安卓的多屏异显相关问题,具体有时间也来给大家做个简单的多屏异显demo 其他就不多说了,下面就开干: Android手机大厂Framework系统-Input系统专题实战课 https://ke.qq.com/course/4963459 [入门课,实战课,跨进程专题 ps需要学习深入framework课程和课程优惠 新课程优惠获取请加入qq群:422901085(获取demo源码) 1、双屏模拟 因为手机一般没有两个屏幕,所以这种硬件设备还比较难找,但是and

liaosongmao1的专栏 992

跟着团子学SAP CO:熟练使用结果分析码实现各个场景下收入成本的匹配(一) KKA2/CJ88

PS模块中对财务顾问最难的点在于项目结算,特别是销售型的项目结算。针对客户型项目结算我列举了以下常见的收入成本匹配的一些场景: (1)在项目执行过程中会多次开票,但由于各期成本浮动很大(如前期可能只涉及一些人工、中期全是比较金额较大的材料费),所以希望开票的时候能通过合理的一些指标进行主营业务成本与主营业务收入的匹配。 (2)项目过程中会多次开票,开票确认主营业务收入时,直接将累计发生的实际成本结转为主营业务成本。 (3)项目过程中虽多次开票,但不确认收入,所有发生的实际成本月末计算为在制品,最后项目一次性

Lucas1211的博客 9534

修改Android idc文件

安卓系统idc文件里面包含以下几点内容: 1 #=0 外部设备 =1内部设备 2 device.internal = 0 3 #定义:keyboard.layout = <name> 4 #指定与输入设备关联的键布局文件的名称,不包括.kl扩展名。 如果找不到此文件,输入系统将使用默认键布局。 5 keyboard.layout = qwerty 6 #定义...

weixin_30569033的博客 1113

LabVIEW工程密码保护机制与移除技术详解

LabVIEW作为工业自动化领域广泛使用的图形化编程工具,其密码保护机制涉及文件加密与权限控制等核心技术。从技术实现来看,现代版本采用AES-128加密结合SHA-256哈希校验,而经典版本使用XOR加密配合Base64编码。理解这些加密原理对于工程维护、灾难恢复等合法场景至关重要。在实际应用中,密码移除工具需要处理不同版本的文件结构差异,包括解析XML描述区的Protection标签、动态识别版本并应用对应解密策略。这类技术在工业设备维护、教学研究等场景具有重要价值,但必须注意遵守法律边界,确保拥有合法的

weixin_34161083的博客 390

手把手教你学Simulink--Simulink智能驾驶场景挑战:高速公路入口匝道汇入仿真

高速公路入口匝道汇入在智能驾驶中的作用是当车辆从入口匝道进入主干道时,系统能够自主决策并执行汇入操作,确保安全和高效。目标识别与跟踪:如检测前方障碍物、识别车道线。路径规划:如计算最优汇入路径。动态控制:如调整速度、转向等以完成汇入动作。本示例将展示如何使用Simulink构建一个用于智能车辆高速公路入口匝道汇入的仿真模型,并进行验证。通过本指南,我们介绍了如何基于Simulink搭建一个用于智能车辆高速公路入口匝道汇入的仿真模型,并进行仿真和性能评估。背景介绍。

MHD0815的博客 263

Android 12 多屏异触

android多屏异触

ffy5201314的专栏 1104

YOLOv11数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强

本文介绍了YOLOv11目标检测中的数据集增强技术,重点解决图像与标注标签同步扩充的关键问题。文章系统分析了三类增强方法:几何变换(翻转、旋转、缩放)、颜色变换(亮度、对比度调整)和高级增强(Mosaic、MixUp),并探讨了其在小样本检测、复杂场景泛化和多方向目标识别等场景的应用价值。针对核心的标签同步问题,提供了基于Python和OpenCV的详细代码实现示例,展示如何对图像进行水平翻转和缩放操作时精确调整YOLO格式边界框坐标。该技术能有效解决训练数据不足和多样性匮乏问题,显著提升模型的泛化性能。

走向CTO的路上... 1514

android双触摸屏原理,android 双触摸屏(touchscreen)实现--kernel driver

背景本文主要实现一个Android系统,调试两个相同的TP设备,使用同一个TP的驱动。最终实现结果,两个TP都可以控制Android,正常报点。 实现过程:硬件连接介绍: 软件实现:在dtsi文件添加两个TP设备(名字不一样):LA.UM.5.6\kernel\msm-3.18\arch\arm\boot\dts\qcom\msm8937-pmi8937-qrd-sku2.dtsi&soc...

weixin_28940217的博客 1700

【腾讯小龙虾WorkBuddy专栏04】一文搞懂WorkBuddy的「专家」和「专家团」

WorkBuddy专家与专家团:专业级AI协作解决方案 WorkBuddy的专家(Expert)与专家团(Expert Team)功能颠覆了通用AI的局限性,提供角色化、可交付的专业服务。 核心优势 专家:深度垂直领域的AI顾问,具备人设、方法论、工具链,如全栈开发专家能直接交付完整项目,而非代码片段。 专家团:多智能体协作,自动拆解复杂任务(如竞品分析、全栈开发)并分发给对应角色,并行执行后整合输出,效率提升显著。 使用场景 单专家:解决专业问题(如SQL优化、UI设计)。

AI人人懂 2025

Java:PriorityQueue详解——从零基础到应用

看了网上的详解,我反是一篇没看懂,都是什么垃圾玩意也发出来,无语,我自己根据这两天的学习总结出来了下面这些干货,我就是这么学会的,大家要是零基础看肯定木问题。

流楚丶格念的博客 6142

android 触摸事件传递机制,Android事件传递(分发)机制

Android事件的构成:在android中,事件主要包括点按,长按,拖拽,滑动等等,另外点按还包括点击和双击。所有这些都构成了android中的事件响应。总的来说所有的事件都由以下三个部分组成:按下(ACTION_DOWM)移动(ACTION_MOVE)抬起(ACTION_UP)所有操作首先执行的是按下的操作,之后所有的操作都是以按下作为前提的,这一系列的操作的可以在android中控制。我们知...

weixin_33148993的博客 177

第五章 TTM 后备管理:5.6系统内存域

系统内存域由 TTM 内置资源管理器管理,通过 ttm_tt 承载页信息,依赖 ttm_pool 提供物理页。ttm_tt 管理页数组、缓存属性与状态标志,支持外部页与换出机制。初始化分 ttm_tt_init 与 ttm_sg_tt_init,生命周期包括创建、填充、释放与销毁。页池针对 write-combined、uncached 及一致性 DMA 分配的页进行缓存,提升性能并减少 TLB 刷新。分配时高阶优先、批量设置缓存属性,回收时清零后归还池中,确保高效复用。

图形/计算GPU的驱动与虚拟化技术分享园地 2569

Android 触摸事件分发传递机制

activity.dispatchTouchEvent ---  ViewGroup.dispatchTouchEvent ----  View.dispatchTouchEvent ---  View.ontouchEvent ----  ViewGroup.onTouchEvent ----- activity.onTouchEvent =======================

高低调的博客 479

深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进

华为Limera激光雷达摄像头融合技术推动自动驾驶感知升级 华为推出的Limera创新性地将激光雷达与摄像头深度集成,采用共光路设计实现数据天然对齐,在小型障碍物识别等关键场景展现卓越性能。该产品代表了传感器前融合技术从分立走向共生的演进趋势,通过硬件级集成解决了多源异构数据融合难题。随着索尼堆叠式传感器等技术的出现,未来智能汽车感知系统将向高度集成的"超级传感器"方向发展,实现更精准的环境感知。Limera的发布标志着前融合技术从"可用"迈向"极致&quo

致力于lidar应用开发 398

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android触摸事件传递机制—源码解读

在做需求开发中,我使用ViewPager嵌套Fragment,而Fragment又嵌套了Recyclerview组件。这样就导致RV滑动与Viewpager滑动事件产生手势冲突的问题。在深入理解Android触摸事件的传递机制后,我解决了这个问题。遂决定写下这篇博客,来深入分析相关源码。

m0_53269463的博客 957

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android触摸事件传递机制

前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 一、了解Activity的构成 一个Activity包含了一个Window对象,这个对象是由PhoneWindow来实现的。PhoneWindow将DecorView作为整个应用窗口的根View,而这个DecorView又将屏幕划分为两个区域:一个是TitleView,另一个是Content...

IT元老的博客 327

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android 事件分发机制详解与实战剖析 | 开发者说·DTalk

本文原作者: 门心叼龙,原文发布于: https://blog.youkuaiyun.com/geduo_83/article/details/86560896本文为自己多年来在 A...

谷歌开发者 808

Android MotionEvent分发机制

一、简单说一下分发机制原理 在看分发机制的时候,需要知道MotionEvent是一层一层向下分发的,通过ViewGroup的dispatchTouchEvent方法进行分发。 ViewGroup的dispatchTouchEvent方法会先调用ViewGroup的onInterceptTouchEvent方法。 如果返回true,会直接调用ViewGroup的onTouchEvent; 如

sirenyizhi的博客 768

《Android View 的事件分发机制解析》

前言: 用户按下触摸屏幕的事件。ACTION_UP: 用户抬起手指的事件。: 用户在屏幕上移动手指的事件。: 事件被取消,例如由于系统的其他操作。: 当已经有一个手指按下的情况下,另一个手指按下会产生该事件;: 多个手指同时按下的情况下,抬起其中一个手指会产生该事件;

weijiangbc0的博客 1456

android事件分发机制原理源码分析详解

  我们都知道,在android里当点击一个控件时,系统能准确地将事件传递给真正需要这个事件的控件,那么当android系统捕获到用户的各种输入时间之后,是如何传递分发的呢?其实android系统我们提供了一整套完善的事件传递、分发、处理机制,来帮助开发者完成准确的事件分发与处理。  要了解触摸事件的拦截机制,首先要了解什么是触摸事件?顾名思义,触摸事件就是捕获触摸屏幕后产生的事件。通常的当点击屏...

qtiao的博客 1283

Android中的事件分发机制简述

Android的事件分发机制是处理用户触摸(Touch)事件在View层级中传递、消耗的核心机制,其流程可概括为从Activity到ViewGroup,再到View的三层传递,最终由合适的View消费事件。以下是关键流程和核心方法:事件从Activity开始,通过ViewGroup层层传递,最终到达叶子节点View,若未被消费则原路返回。 2. ViewGroup → 子View 3. View处理事件 四、关键规则 事件传递顺序: → → 。 拦截规则: ViewGroup可通过拦截事件,一旦拦

分享技术和日常 419

ViewGroup对触摸事件的分发响应过程

ViewGroup对触摸事件的分发响应过程,为什么View onTouchEvent,ACTION_DOWN返回false,View再接收不到后续touch?View onTouchEvent,ACTION_DOWN返回true,之后事件不再从走原有分发过程,而直接分发到此View上去?ViewGroup如何实现事件拦截的思路等.........结合这篇博客看源码,nice

free logic的专栏 1072

Android自定义控件系列九:从源码看Android触摸事件分发机制

Android触摸事件,网上也有很多文章来讲了,今天在这里想使用例子和源码相结合的方式,可能会看的更清晰一些。 对于dispatchTouchEvent和onInterceptTouchEvent可以这样理解,dispatchTouchEvent方法是一个快递员,onInterceptTouchEvent方法是公司的门卫,快递员要给公司送的每批快递就是一个完整的触摸事件,每一批快递有一个为首的物品:Down事件;送货有一个规定:如果这批快递的为首的这个物品(Down)被门卫(onInterc

苦咖啡的自留地 5694

Android touch事件分发机制★

首先先从源码的角度分析View的事件分发。 从一个简单的例子入手。比如说你当前有一个非常简单的项目,只有一个Activity,并且Activity中只有一个按钮。如果想要给这个按钮注册一个点击事件,只需要调用: button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(“TAG”, “onClick execute”); } }); 这样在onClick方法里面写实现,就可以

zenmela2011的专栏 2981

安卓事件分发机制

事件分发机制

我是小彬彬 248
上一篇: Android中获取屏幕物理尺寸的方法
下一篇: Android中解析html网页
classTC
博客等级 码龄15年 46粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值