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

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

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.mfbz.cn/a/767706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于物品的协同过滤算法

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

iPhone苹果手机怎么取消腾讯视频VIP会员自动续费?

腾讯视频会员分为VIP(同时在线设备5台、同时播放设备2台;)和SVIP(同时在线设备8台、同时播放设备3台;),在iPhone苹果手机上开通腾讯视频连续包月、包季、包年后,需要手动取消才能关闭…

UE4_材质_材质节点_DepthFade

一、DepthFade参数 DepthFade(深度消退)表达式用来隐藏半透明对象与不透明对象相交时出现的不美观接缝。 项目说明属性消退距离(Fade Distance)这是应该发生消退的全局空间距离。未连接 FadeDistance(FadeDistance&a…

被⽹络罪犯利⽤的5⼤ChatGPT越狱提⽰

⾃ChatGPT发布的近18个月以来,⽹络罪犯们已经能够利⽤⽣成式AI进⾏攻击。OpenAI在其内容政策中制定了限制措施,以阻⽌⽣成恶意内容。作为回应,攻击者们创建了⾃⼰的⽣成式AI平台,如 WormGPT和FraudGPT,并且他们还分享了…

Ubuntu22.04上Docker的安装

1. 使用APT安装 首先安装HTTPS传输的软件包和CA证书,确保软件下载过程中不被篡改。 sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y然后,使用国内源,并添加软件源的 GPG 密钥以防…

删除keil!VSvode+eide+jlink(stlink)配置keil工程,调试使用cortex-debug+openocd

文章目录 目的前期准备1.软件安装2.VScode安装3.VScode插件安装4.安装ARM-GCC交叉编译器 工程导入程序编译jlink在线调试部分常见问题更改为GCC 编译器更改为stlinkopencd一些tips调试变量查看构建器选项配置 目的 提示:这里可以添加技术概要 vscode代替keil进行程…

Ozon、美客多补单测评黑科技:打造无懈可击的自养号补单环境

不管哪个跨境平台的风控都会做升级,相对的补单技术也需要进行相应的做升级,风控升级后,自己养号补单需要注意以下技术问题,以确保补单的稳定性和安全性: 一、物理环境 1. 硬件参数伪装:平台已经开始通过I…

择校秘籍:如何找到口碑爆棚的学校?以星贝育园为例

在为孩子选择学校时,家长们总是慎之又慎,希望能找到一所口碑好、教育质量高的学校,为孩子的未来奠定坚实的基础。今天,我们就以星贝育园为例,来探讨一下如何选择口碑好的学校。 一、考察师资力量 优秀的教师团队是一所…

什么是定时器?

前言👀~ 上一章我们介绍了阻塞队列以及生产者消息模式,今天我们来讲讲定时器 定时器 标准库中的定时器 schedule()方法 扫描线程 手动实现定时器 任务类 存储任务的数据结构 定时器类 如果各位对文章的内容感兴趣的话,请点点小赞&am…

帮找Java Bug,面试,项目,解决Java问题

本人是个Java老程序员,如果你有解决不了的问题,或者面试的时候需要人帮助,或者求职就业上任何问题都可以联系我,下面是我微信,欢迎联系我!

【JUC】可重入锁理解

可重入锁(Reentrant Lock),也称作递归锁,是一种特殊的锁机制,它允许同一个线程多次获取同一个锁。 优点是可以避免死锁。 public class WhatReentrant {public static void main(String[] args) {new Thread(new Runn…

Qt——升级系列(Level Eight):界面优化

目录 QSS 背景介绍 基本语法 QSS设置方式 指定控件样式设置 全局样式设置 从文件加载样式表 使用Qt Designer 编辑样式 选择器 选择器概况 子控件选择器 伪类选择器 样式属性 盒模型 控件样式示例 按钮 复选框、单选框 输入框 列表 菜单栏 登录界面 绘图 基本概念 绘制各种形…

【Kali-linux for WSL】图形化界面安装

文章目录 前言图形化界面安装 前言 之前在WSL中安装了Kali 启动之后发现什么都没有!!! 那我还怎么学习渗透技术??? 看来,得改进下我的kali-linux for wsl,安装个图形化界面 图形化…

Jetson系列机载电脑创建热点模式配置方法

Jetson nano为例—— 创建热点模式配置方法 1.1、新建一个 WiFi 在屏幕右上角找到网络图标,点击后选择“Edit Connections”选项,进入选择网络连接页面,然后点击左下角加号,新建一个连接,类型选择 WiFi 后点击 “cre…

AI降重,不再难:降AI率的实用技巧大揭秘

如何有效降低AIGC论文的重复率,也就是我们说的aigc如何降重?AIGC疑似度过高确实是个比较愁人的问题。如果你用AI帮忙写了论文,就一定要在交稿之前做一下AIGC降重的检查。一般来说,如果论文的AIGC超过30%,很可能会被判定…

剪画小程序:如何将视频变成自己的作品!在手机上这样做就可以了!

亲爱的小伙伴们,我是你们的博主小画! 今天和大家分享两个在视频剪辑中实用的技巧—旋转视频和添加水印! 在我们的创作过程中,有时候常规的视角并不能完全展现出视频的魅力和创意。而通过旋转视频,就能为观众带来全新的…

【云原生监控】Prometheus 普罗米修斯从搭建到使用详解

目录 一、前言 二、服务监控概述 2.1 什么是微服务监控 2.2 微服务监控指标 2.3 微服务监控工具 三、Prometheus概述 3.1 Prometheus是什么 3.2 Prometheus 特点 3.3 Prometheus 架构图 3.3.1 Prometheus核心组件 3.3.2 Prometheus 工作流程 3.4 Prometheus 应用场景…

新规则!2024年信息素养大赛复赛图形化编程题这么写系统才能通过

2024年全国青少年信息素养大赛复赛即将在7月6日陆续开赛,今年Scratch图形化编程小低组和小高组分别为6道编程题,将采用新的判题规则,类似GESP的OJ系统判题,主要有以下三个方面: 1、变量名大小写要和题目完全一致。 2…

数据万象推出智能检索MetaInsight,现已开启限时公测

海量文件的分析统计一直是对象存储COS的热点需求,伴随AIGC飞速迭代发展,在众多不同模态素材的海洋中,用户也急需更高效地管理和利用多媒体内容,打破传统搜索的桎梏。 数据万象推出的智能检索 MetaInsight 服务将多模态检索与元数…

开源之夏|祝贺MatrixOne开源社区项目中选同学!

在本届「开源之夏 2024」活动中,MatrixOne开源社区共计上线3个项目任务,最终有 3位同学成功突围。接下来让我们看看每个项目的详细中选情况: 中选学生公示 项目名称:基于大语言模型的操作系统任务自动识别,拆解&#…