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中事件分发的实现。掌握这些知识点,可以帮助我们更好地进行事件处理和控件开发,提高应用的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s入门到实战(一)—— kubernetes概述

k8s 概述 k8s github地址:https://github.com/kubernetes/kubernetes 官方文档:https://kubernetes.io/zh-cn/docs/home/ k8s,全程是 kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员” k8s 这…

mysql忘记root密码

一、用安全模式启动mysql 在 my.ini(windows的安装目录)或 /etc/my.cnf(linux) 的最后一行添加 skip-grant-tables1 重启mysql服务 systemctl restart mysqld 二、创建admin用户 免密码使用root登录进去 $ mysql -uroot 创建…

启动性能优化

一、应用启动慢的原因 1.在主线程执行了太多耗时的操作,比如加载数据,或者初始化三方库等等,导致在Application的oncreate或者Activity的oncreate方法中耗时太久 2.布局嵌套太深,或者一些不会立即使用的布局也在一开始一起加载到…

Linux-Miniconda安装

下载miniconda安装文件 get "https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh" -O ~/miniconda.sh 如果是其它系统或者架构,访问地址获取对应安装脚本: https://mirrors.tuna.tsinghua.edu.cn…

Offlian RL: Weighted Policy Constraints for Offline Reinforcement Learning

AAAI 2023 paper Intro 分布偏移导致离线RL对于OOD数据存在过估计问题。因此一些方法限制策略靠近行为策略。但是着很大程度受限于数据集的质量。若是数据集存在非专家,一个自然的问题是是否有可能构建一个更合理的策略约束方法,该方法通过识别数据集中…

面试算法-111-课程表 II

题目 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。 例如,想要学习课程 0 ,你需要先完成…

SpringBoot 3整合Elasticsearch 8

这里写自定义目录标题 版本说明spring boot POM依赖application.yml配置新建模型映射Repository简单测试完整项目文件目录结构windows下elasticsearch安装配置 版本说明 官网说明 本文使用最新的版本 springboot: 3.2.3 spring-data elasticsearch: 5.2.3 elasticsearch: 8.1…

2024年软件测试岗现状?“我“进阶了测试开发,一路狂飙...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、测试工程师的现…

SM2098EHD:巴西双电压球泡灯应用

巴西使用的双电压系统主要包括127V和240V。这种双电压系统是为了适应不同的电器设备和需求。在巴西,有些电器设备可能需要127V的电压,而有些则可能需要240V的电压。 因此,如果你在巴西使用电器设备,需要确保设备能够适应巴西的双…

【数据结构】绪论

文章目录 开篇:数据结构的学习之路1、开篇_数据结构在学什么2、数据结构的基本概念数据数据元素、数据项数据结构、数据对象数据类型、抽象数据类型数据结构的三要素逻辑结构数据的物理结构(存储结构)数据的运算 最后总结内容 3、算法的基本概…

Linux 理解文件系统、磁盘结构、软硬链接

目录 一、理解磁盘结构 1、磁盘的物理结构 2、硬件层面理解 3、磁盘的具体物理存储结构 4、进行逻辑抽象 5、磁盘文件的管理 6、创建新文件的过程 二、理解文件系统 1、文件的构成 2、为何选择4KB而非512字节作为基本单位? 3、文件系统的组成 数据块(Data Blocks&a…

图像抠图DIS——自然图像中高精度二分图像抠图的方法(C++/python模型推理)

概述 DIS(Dichotomous Image Segmentation)是一种新的图像分割任务,旨在从自然图像中分割出高精度的物体。与传统的图像分割任务相比,DIS更侧重于具有单个或几个目标的图像,因此可以提供更丰富准确的细节。 为了研究…

Oracle完全开发手册基础版(一篇学会所有Oracle所有知识点)

一、Oracle基础 1.简介 Oracle Database,又名Oracle RDBMS,或简称Oracle,是甲骨文公司的一款关系数据库管理系统。本课程主要介绍Oracle的SQL基础,包括表空间的概念,如何登录Oracle数据库,如何管理表及表中的数据,以及约束的应用。为后续课程的学习打下一个良好的基础…

Ubuntu20.04上,VTK9.3在QT5上的环境配置与开发测试

Ubuntu20.04上,VTK9.3在QT5上的环境配置与开发测试 1 背景介绍2 VTK9.3的编译安装2.1 安装ccmake 和 VTK 的依赖项:2.2 建立VTK编译文件夹并下载2.3 cmake配置VTK9.3的编译环境2.4 make编译安装VTK9.32.5 测试VTK安装是否成功 3 基于qmake的QT5的VTK9.3开…

Nginx中设置反向代理

在Nginx中设置反向代理,你需要使用proxy_pass指令。以下是一个简单的配置示例,它将Nginx配置为反向代理,将进入的流量转发到在本地运行的Web服务器上。 nginx http { server { listen 80; location / {proxy_pass http://localhost:8080;pro…

异地共享文件如何设置?

在当今数字化时代,异地办公已成为常态,越来越多的企业和个人需要在不同地区间进行文件共享与访问。为了解决复杂网络环境下的远程连接问题,北京金万维科技有限公司推出了一款名为【天联】的异地组网内网穿透产品。 【天联】组网是一款由北京金…

docker学习笔记 二-----docker介绍

老套路哈,第一章先科普一下三种常见的云服务类型,第二和第三章节写docker学习笔记。 一 、IAAS、PAAS、SAAS IAAS (Infrastructure as a Service):基础即服务,供应商仅提供给用户最基础设施的服务资源,也就是服务器资…

2990: 【C3】【递推】蟠桃记

题目描述 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题! 什么问题?他研究的问题是蟠桃一共有多少个! 不过,到…

python基础——语句

一、条件语句 就是 if else 语句 ! 代表不等于 代表等于if 关键字,判断语句,有“如果”的意思,后面跟上判断语句else 常和“if” 连用,有“否则”的意思,后面直接跟上冒号 …

Offer必备算法17_子数组子串dp_八道力扣题详解(由易到难)

目录 ①力扣53. 最大子数组和 解析代码 ②力扣918. 环形子数组的最大和 解析代码 ③力扣152. 乘积最大子数组 解析代码 ④力扣1567. 乘积为正数的最长子数组长度 解析代码 ⑤力扣413. 等差数列划分 解析代码 ⑥力扣978. 最长湍流子数组 解析代码 ⑦力扣139. 单词拆…