Android下的Touch事件分发详解
文章目录
- 一、事件传递路径
- 二、触摸事件的三个关键方法
- 2.1 dispatchTouchEvent(MotionEvent ev)
- 2.2 onInterceptTouchEvent(MotionEvent ev)
- 2.3 onTouchEvent(MotionEvent event)
- 三、ViewGroup中的dispatchTouchEvent实现
- 四、总结
在Android系统中,触摸事件的分发和处理是一个非常重要的部分。了解触摸事件的分发机制对于我们进行界面交互设计和优化具有重要意义。本文将详细介绍Android下的Touch事件分发机制,包括事件分发的过程、涉及的方法以及ViewGroup中事件分发的实现。
一、事件传递路径
触摸事件的传递路径是从Activity到Window,再到View。具体来说,当一个触摸事件产生时,首先会传递给Activity的dispatchTouchEvent方法,然后由Activity将事件传递给Window,最后由Window将事件传递给顶层的View。在View层级结构中,事件会从上到下(父View到子View)进行传递,直到有一个View能够处理这个事件为止。
二、触摸事件的三个关键方法
在Android系统中,触摸事件的分发过程涉及到三个重要的方法:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)和onTouchEvent(MotionEvent ev)。下面我们分别来看一下这三个方法在ViewGroup和Activity中的作用。
2.1 dispatchTouchEvent(MotionEvent ev)
此方法用来分发事件。如果当前事件能传递到该View,该方法一定会被调用。当Touch事件发生时,Activity的dispatchTouchEvent(MotionEvent ev)方法会以隧道方式将事件传递给最外层View的dispatchTouchEvent(MotionEvent ev)方法,并由该View的dispatchTouchEvent(MotionEvent ev)方法对事件进行分发。
2.2 onInterceptTouchEvent(MotionEvent ev)
此方法用来拦截事件。如果返回值为true,表示拦截,否则不拦截。在外层View的dispatchTouchEvent(MotionEvent ev)方法返回系统默认的super.dispatchTouchEvent(ev)情况下,事件会自动的分发给当前View的onInterceptTouchEvent方法。
2.3 onTouchEvent(MotionEvent event)
此方法用于处理当前事件。如果返回值为true表示消耗该事件,否则无法再接收同一个序列的事件。如果dispatchTouchEvent方法return false,事件会以冒泡方式返回给上层的onTouchEvent进行消费。
三、ViewGroup中的dispatchTouchEvent实现
在Android系统中,ViewGroup对dispatchTouchEvent方法进行了重载,以实现更复杂的事件分发逻辑。以下是一些关键的代码片段:
public boolean dispatchTouchEvent(MotionEvent ev) {boolean handled = false;// 调用onInterceptTouchEvent方法来判断是否需要拦截当前的触摸事件if (onInterceptTouchEvent(ev)) {// 如果需要拦截,就会将事件的动作设置为ACTION_CANCEL,并清除所有的触摸目标。ev.setAction(MotionEvent.ACTION_CANCEL);if (mFirstTouchTarget != null) {removePointersFromTouchTargets(0);}handled = true;} else {// 如果没有触摸目标,就会调用onTouchEvent方法来处理事件if (mFirstTouchTarget == null) {handled = onTouchEvent(ev);} else {// 如果有触摸目标,就会遍历所有的触摸目标,调用dispatchTransformedTouchEvent方法来分发事件。TouchTarget target = mFirstTouchTarget;while (target != null) {TouchTarget next = target.next;if (dispatchTransformedTouchEvent(ev, false, target.child, target.pointerIdBits)) {handled = true;}target = next;}}}return handled;
}
首先,onInterceptTouchEvent方法被调用,用于判断当前ViewGroup是否要拦截这个触摸事件。如果onInterceptTouchEvent返回true,那么这个触摸事件将会被拦截,不再向下传递,同时触摸事件的action将会被设置为ACTION_CANCEL,表示这个触摸事件被取消。
然后,如果没有拦截触摸事件,那么会检查是否有触摸目标(mFirstTouchTarget)。如果没有触摸目标,那么会直接调用onTouchEvent方法来处理这个触摸事件。如果有触摸目标,那么会遍历所有的触摸目标,并调用dispatchTransformedTouchEvent方法来分发触摸事件。这个过程会一直进行,直到找到能够处理这个触摸事件的View为止。
总的来说,ViewGroup的dispatchTouchEvent方法通过调用onInterceptTouchEvent和onTouchEvent方法,实现了触摸事件的拦截和处理。这个过程涉及到了事件的分发、拦截和消费,是理解Android触摸事件分发机制的关键。
四、总结
通过本文的介绍,我们了解了Android下的Touch事件分发机制,包括事件分发的过程、涉及的方法以及ViewGroup中事件分发的实现。掌握这些知识点,可以帮助我们更好地进行事件处理和控件开发,提高应用的用户体验。
相关文章:
Android下的Touch事件分发详解
文章目录 一、事件传递路径二、触摸事件的三个关键方法2.1 dispatchTouchEvent(MotionEvent ev)2.2 onInterceptTouchEvent(MotionEvent ev)2.3 onTouchEvent(MotionEvent event) 三、ViewGroup中的dispatchTouchEvent实现四、总结 在Android系统中,触摸事件的分发和…...

uniapp的配置文件、入口文件、主组件、页面管理部分
pages.json 配置文件,全局页面路径配置,应用的状态栏、导航条、标题、窗口背景色设置等 main.js 入口文件,主要作用是初始化vue实例、定义全局组件、使用需要的插件如 vuex,注意uniapp无法使用vue-router,路由须在pag…...

B端设计:如何让UI组件库成为助力,而不是阻力。
首发2023-09-24 15:42贝格前端工场 Hi,我是大千UI工场,网上的UI组件库琳琅满目,比如elementUI、antdesign、iview等等,甚至很多前端框架,也出了很多UI组件,如若依、Layui、bootstrap等等,作为U…...

敏捷开发最佳实践:学习与改进维度实践案例之会诊式培养敏捷教练
自组织团队能够定期反思并采取针对性行动来提升人效,但2022年的敏捷调研发现,70%的中国企业在学习和改进方面仍停留在团队级。本节实践案例将分享“会诊式培养敏捷教练”的具体做法,突出了敏捷以人为本的学习和改进,强调了通过人员…...

C#宿舍信息管理系统
简介 功能 1.发布公告 2.地理信息与天气信息的弹窗 3.学生信息的增删改查 4.宿舍信息的增删改查 5.管理员信息的增删改查 6.学生对宿舍物品的报修与核实 7.学生提交请假与销假 8.管理员对保修的审批 9.管理员对请假的审批 技术 1.采用C#\Winform开发的C\S系统 2.采用MD5对数据…...

测试环境搭建整套大数据系统(十三:设置开机自启动)
一:编写程序启动命令脚本 vim /root/start.sh二:编写启动脚本 cd /etc/systemd/system vim start.service[Unit] DescriptionStart My Server Afternetwork.target[Service] Typeforking ExecStart/root/start start TimeoutSec0 RemainafterExityes G…...
算法练习第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
45. 跳跃游戏 II 55. 跳跃游戏 122.买卖股票的最佳时机II 122.买卖股票的最佳时机II class Solution {public int maxProfit(int[] prices) {int result 0;for(int i 1;i<prices.length;i){result Math.max(prices[i] - prices[i-1],0);}return result;} }跳跃游戏 cla…...

nodejs+vue反诈科普平台的设计与实现pythonflask-django-php
相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低反诈科普平台的运营人员成本,实现了反诈科普平台的标准化、制度化、程序化的管理,有效地防止了反诈科普平台的随意管理,提高了信息的处理速度和精确度,能够…...

SpringBoot3+JPA+MySQL实现多数据源的读写分离(基于EntityManagerFactory)
1、简介 在Spring Boot中配置多个数据源并实现自动切换EntityManager,这里我编写了一个RoutingEntityManagerFactory和AOP(面向切面编程)的方式来实现。 这里我配置了两个数据源:primary和secondary,其中primary主数…...

10万+SRC高质量稀有明星人脸素材唐嫣杨紫金晨倪妮蔡卓妍张雨绮合集
素材下载:点击下载 DFL模型训练用,高质量SRC素材合集: 【唐嫣_WF】6000张src人脸素材【金鱼基础模型库】用于补全SRC极限角度范冰冰 WF 512 苹果稀有死亡角度.zip王鸥_WF_512 多部电影 有死亡角度和张嘴的,5000多张.rar杨紫 108…...

目标检测中的mAP计算原理和源码实现
简介 在目标检测任务中,mAP(mean Average Precision,平均精度均值)是一个非常重要的评价指标,用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率,能够全面反映模型在检测任务中…...

Unity 粒子在UI中使用时需要注意的地方
最近项目中要在UI中挂载粒子特效,美术给过来的粒子直接放到UI中会有一些问题,查询一些资料后,总结了一下 一: 粒子的大小发生变化,与在预制件编辑中设计的大小不同 在预制件编辑模式下,大小正常 实际使用的时候特别大或者特别小 经过检查,发现预制件编辑模式下,默认画布的Rend…...

了解Spring:Java开发的利器
Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的效率和系统的可维护性。本文将介绍Spring的基本概念、使用优势、设计模式以及与Spring MVC和Spring Boot的关联。 什么是Spring? Spring是一款开源的轻量级Java开发框架,它由多个模…...
【Hive】with 语法 vs cache table 语法
语法分别如下: cache table table_name as (select ... from ... )with table_name as (select ... from ... )需要注意,with语法只相当于一个视图,并不会将数据缓存;如果要将数据缓存,需要使用cache table语法。 参考…...

CleanMyMac X 4.15.1 for Mac 最新中文破解版 系统优化垃圾清理工具
CleanMyMac X for Mac 是一款功能更加强大的系统优化清理工具,相比于 CleanMyMac 4.15.1来说,功能增加了不少,此版本为4.15.1官方最新中英文正式破解版本,永久使用,解决了打开软件崩溃问题,最新版4.15.1版本…...

查看Linux系统重启的四种基本命令
目录 前言1. last2. uptime3. journalctl4. dmesg 前言 对于排查其原因推荐阅读:详细分析服务器自动重启原因(涉及Linux、Window) 在Linux中,有多种命令可以查看系统重启的信息 以下是其中一些常用的命令及其解释: …...

I/O多路复用:select/poll/epoll
最基本的 Socket 模型 要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。 Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要…...

使用ansible批量修改操作系统管理员账号密码
一、ansible server端配置 1、对于Linux主机配置免密登录ssh-copy-id -i ~/.ssh/id_rsa.pub rootremote_ip 2、在/etc/ansible/hosts文件中添加相应主机IP 3、对于Windows主机需要在/etc/ansible/hosts文件中进行以下配置 192.168.83.132 ansible_ssh_useradministrator an…...

webpack5零基础入门-13生产模式
1.生产模式介绍 生产模式是开发完成代码后,我们需要得到代码将来部署上线。 这个模式下我们主要对代码进行优化,让其运行性能更好。 优化主要从两个角度出发: 优化代码运行性能优化代码打包速度 2.生产模式准备 我们分别准备两个配置文件来放不同的…...

一篇复现Docker镜像操作与容器操作
华子目录 Docker镜像操作创建镜像方式1docker commit示例 方式2docker import示例1:从本地文件系统导入示例2:从远程URL导入注意事项 方式3docker build示例1:构建镜像并指定名称和标签示例2:使用自定义的 Dockerfile 路径构建镜像…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...