Android触摸事件分发关键点【笔记摘要】

news2024/12/27 12:19:32

触摸事件分发:就是一个为了解决触摸事件冲突而设置的机制

1.事件类型

ACTION_DOWN -> ACTION_UP / ACTION_CANCEL
ACTION_DOWN -> ACTION_MOVE -> ACTION_MOVE -> ACTION_MOVE -> ACTION_UP / ACTION_CANCEL
这个取消事件ACTION_CANCEL它是一种特殊的事件,它对应的是时间序列的非人为的提前结束

2.onTouchEvent()

在Android里面,每一个触摸事件都会交给View的onTouchEvent()方法来处理

当用户的手指刚刚触摸到屏幕的时候,也就是一个事件组第一个事件DOWN发生的时候,Android会从用户的触摸点上离用户最近的那个View开始,向下一个一个地去调用每一个View的onTouchEvent(),如果View的onTouchEvent()对这个Down事件没有响应,它就会继续向下,直到遇到第一个做出响应的View,这个向下的过程才会结束。这个时候,这个View就成为了这组事件的接收者,这个DOWN事件的后续事件都会直接发送给它,不会给它上面的View,也不会给它下面的View,直到这组事件结束,也就是UP事件或者CANCEL事件出现

View是否响应DOWN事件,其实取决于onTouchEvent()的返回值是否为true。其实只有DOWN事件的返回值需要是true,像后续事件UP或者MOVE它们的返回值是没有影响的。但是如果要自定义,全都写成true不是挺方便的吗

如果想要写自己的触摸反馈算法,只要重写onTouchEvent()在里面写自己的算法,然后返回true就好了
在这里插入图片描述

3.onInterceptTouchEvent()

它用于触摸事件分发里面的事件拦截机制

在用户触摸屏幕的时候,每一个触摸事件到达View的onTouchView()之前,Android会从整个Activity里面最底部的那个根View,向上一级一级地询问:你要不要拦截这组事件,如果整个流程走完,所有的ViewGroup都不拦截,这个时候就会走第二个流程:onTouchEvent() 从上往下。而如果中途某个View拦截事件,那么这个事件就不会再发给它的子View,而是直接转交给它自己的onTouchEvent()来处理,并且在这之后的这个事件组的所有后续事件就全部都会被自动拦截了,不会再交给它的子View,也不会交给它的onInterceptTouchEvent(),而是直接交给它的onTouchEvent()

ViewGroup是否拦截事件,是通过调用 ViewGroup 的 onInterceptTouchEvent() 方法来实现的,返回true表示拦截
当onInterceptTouchEvent()返回true的时候,除了完成事件接管,它还会对它的子View发送一个额外的取消事件CANCEL,通知子View恢复状态

另外onInterceptTouchEvent()和onTouchEvent()有一点不同在于,onTouchEvent()是否要消费这组事件是需要在DOWN事件中决定的,如果在DOWN事件发过来的时候返回了false,那么以后你就跟这组事件无缘了,没有第二次机会;而onInterceptTouchEvent()则是你在整个过程中都可以对事件流中的每个事件进行监听,随时可以返回true,来对事件流进行接管。

所以如果要写一个可以滑动或者捏撑的ViewGroup,那么除了重写onTouchEvent()来处理事件,还需要重写onInterceptTouchEvent(),在DOWN事件的时候返回false,然后在后续事件中,在你觉得合适的时候,返回true来实现事件的拦截接管
在这里插入图片描述

4.requestDisallowInterceptTouchEvent()

在事件过程中在子View里面,调用父View的requestDisallowInterceptTouchEvent(true),例如getParent().requestDisallowInterceptTouchEvent(true),父View在这个事件流中就不会再通过onInterceptTouchEvent()来尝试拦截了,并且它是一个递归方法,它会阻止每一级父View的拦截,不过仅限于当前事件流

5.dispatchTouchEvent()

它是事件分发的总的调度方法,onTouchEvent() 和 onInterceptTouchEvent() 其实都是在dispatchTouchEvent()里面发生的,一个事件分发的过程,实质上就是从根View递归地调用了一次dispatchTouchEvent() 的过程


参考文章:
HenCoder 自定义 View 3-1 触摸反馈,以及 HenCoder Plus

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

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

相关文章

Go语言工程管理

本文内容为Go工程创建和配置开发及简单程序示例。 目录 工程管理 GOPATH 配置GOPATH GOROOT 新建系统变量 配置go工程 添加go path 简单的程序实现 程序代码 开始运行 运行结果 内容解析 总结 工程管理 GOPATH go语言的项目,需要有特定的目录结构进行…

Osg中的智能指针和观察指针

目录 1 设计 内容 1 设计 osg中能够使用智能指针的对象都继承自引用计数类Referenced,观察指针(observer_ptr)与智能指针之间通过ObserverSet相互关联,其中obserserver_ptr直接依赖ObeserverSet。 Referenced不直接依赖ObserverSet类,但可…

springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver 应该如何解决

遇到的问题:项目中引用了外部的达梦jar包 在idea中正常使用 也能找到dm.jdbc.driver.DmDriver 驱动 但是当通过jenkins 构建部署到服务器上 总是报 ClassNotFoundException: dm.jdbc.driver.DmDriver 找不到驱动 应用到的驱动代码如下格式 排查步骤 1.首先看你的项…

hibernate与jpa学习

jpa是一个规范,hibernate是jpa的实现,是一种框架。 hibernate: ORM框架/持久层框架(Object Relational Mapping) 它是是一个轻量级开放源代码的对象关系映射框架,hibernate可以自动生成SQL语句&#xff0…

什么是yum源?如何对其进行配置?

哈喽,大家好呀!这里是码农后端。今天来聊一聊Linux下的yum源及其配置相关的内容。简单来说,yum源就相当于一个管理软件的工具,可以想象成一个很大的仓库,里面存放着各种我们所需要的软件包及其依赖。 一、Linux下软件包…

MySQL:保护数据库

保护数据库 1. 用户1.1 创建用户1.2 查看用户1.3 删除用户1.4 修改密码 2. 权限2.1 授予权限2.2 查看权限2.3 撤销权限 之前都是介绍本地数据库而你自己就是数据库的唯一用户,所以不必考虑安全问题。但实际业务中数据库大多放在服务器里,你必须妥善处理好…

git提交实战

以新项目为例,如何在新项目新分支提交代码。 1.查看文件所在位置 git init 2.克隆项目到本地并完成身份配置 3.将需要新增的文件放到指定目录路径下 4.进入新克隆的文件 cd XXX 5.切换分支 git checkout XXX 6.标红者即为新提交的文件 git status 7.加入 git …

研发驱动 再谱新篇丨美格智能南通研发中心正式成立

近日,美格智能全资设立的众格智能技术(南通)有限公司,正式在江苏省南通市紫琅科技城揭牌成立,此举也标志着继上海、西安、深圳之后,美格智能研发力量布局再谱新篇:美格智能南通研发中心正式成立…

液压传动知识

绪论 工作原理 依靠运动者的液体的压力能传递动力液体在受调节、控制状态下工作,液压传动和控制同等重要液压传动以液体为工作介质 液压系统组成 动力元件:机械能转换为液体压力能。液压泵控制元件:对液体流动方向、压力、流量进行控制或…

Flask框架下图像的base64编码接收和解码流程

一、Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或We…

39. 自由空间光通信中光学天线的设计

设计要求如下: 设计一接收光学天线,满足以下技术要求: 焦距:f60mm,D/f1/1.2,视场角2w0.1,激光波长:λ0.850μm,激光漂移波长:0.848~0.852μm。 光学特性特…

基于物品的协同过滤算法

预估用过户对候选物品的兴趣 计算物品相似度 召回通道 快速做召回条件

Empire Lupin One

信息收集: nmap存活: nmap端口: nmap服务: nmap漏扫: 访问 robots.txt 文件发现目录: 源码: web: 源码并没有藏东西, 用wfuzz发现新页面: icex64 在创建ss…

redis主从复制哨兵模式集群管理

主从复制: 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡&…

ROS学习笔记(18):建图与定位(2)

0.前言 上文提到现在的我们已经进入到了SLAM领域的学习,会涉及到大量专业知识,作为一个自学的大三(好吧也快大四了)萌新并不能保证每次文章的专业性和准确性,所以,本人推荐大家能自己去查阅一些相关书籍和…

2024护网整体工作预案示例

目录 第1章 HW整体工作工作部署 1.1 工作组织架构 1.2 各部门工作职责 1.3 演练期间工作机制 1.3.1 工作汇报机制 1.3.2 应急响应机制 第2章 系统资产梳理整改 2.1 敏感信息梳理整改 2.2 互联网资产发现 2.3 第三方供应商梳理 2.4 业务连接单位梳理 第3…

医疗器械FDA | 医疗器械软件如何做源代码审计?

医疗器械网络安全测试https://link.zhihu.com/?targethttps%3A//www.wanyun.cn/Support%3Fshare%3D24315_ea8a0e47-b38d-4cd6-8ed1-9e7711a8ad5e 医疗器械源代码审计是一个确保医疗器械软件安全性和可靠性的重要过程。以下是医疗器械源代码审计的主要步骤和要点,以…

keil5 Cannot reset target Shutting down debug session 报错解决办法

1.现象 使用GD32下载代码时,突然出现Cannot reset target Shutting down debug session的提示。如下图: 以及: 以前使用GD32都没遇到过这种问题,看了很多其他人的解决办法也不好使,换了stm32的板子去下载又没有这种问…

jdk17卸载后换jdk1.8遇到的问题

过程: 1、找到jdk17所在文件夹,将文件夹进行删除。(问题就源于此,因为没删干净) 2、正常下载jdk1.8,按照网上步骤配置环境变量,这里我参考的文章是: http://t.csdnimg.cn/Svblk …

揭秘:学校教室采用数码管同步时钟的原因-讯鹏电子钟

在学校的教室里,我们常常会看到数码管同步时钟的身影。究竟是什么原因让它成为学校教室的宠儿呢?让我们一同来探究其中的奥秘。 数码管同步时钟具有极高的准确性。对于学校这样一个对时间管理要求严格的场所,准确的时间是保障教学秩序的基石。…