Android事件冲突原理及解决方法

Android事件冲突原理和解决方法

  • MotionEvent 事件类型
  • 事件分发流程
  • onTouch 和 onClick 冲突
  • down 事件分析
  • 冲突解决方法

MotionEvent 事件类型

ACTION_DOWN: 表示手指按下屏幕
ACTION_MOVE: 手指在屏幕上滑动时,会产生一系列的MOVE事件
ACTION_UP: 手指抬起,离开屏幕、
ACTION_CANCEL:当出现异常情况事件序列被中断,会产生该类型事件
ACTION_POINTER_DOWN: 当已经有一个手指按下的情况下,另一个手指按下会产生该事件
ACTION_POINTER_UP: 多个手指同时按下的情况下,抬起其中一个手指会产生该事件

事件分发流程

事件分发主要分三块:分发、拦截、消费。当我们触摸到屏幕的时候,默认会先走 Activity 的分发,接着走 ViewGroup 的分发,然后到 ViewGroup 的拦截,后面再到 View 的分发事件,最后会传到 View 的消费事件。
如果 View 不消费,紧接着回传到 ViewGroup 的消费事件;如果 ViewGroup 也不消费,最后回到 View 的消费事件。// 分发的细节流程:
如果 ViewGroup 的 dispatchTouchEvent 返回 truefalse ,touch 事件不会往子 view 中传递,false 的时候只会触发 action_down ,ViewGroup 的 onTouchEvent 事件也不会被触发。只有在返回 super.dispatchTouchEvent 时候 touch 事件才会传递到子 view。如果 ViewGroup 的 onInterceptTouchEvent 返回 false 或者 super.onInterceptTouchEvent 时,touch 事件会传递到子 view。返回 true 事件不会向下传递,交给自己的 ontouchEvent 处理。如果 view 的 dispatchTouchEvent 返回 truefalse ,touch 事件不会传给自己的 ontouchEvent 事件,返回 false ,只会触发 action_down,move 和 up 不会触发;返回 true,才会触发 move 和 up。返回 super.dispatchTouchEvent,touch 事件才会交给自己的 onTouchEvent 处理。如果 view 的 ontouchEvent 返回 false,只会有 action_down 事件,touch 事件交给上一层处理,如果返回 true 才会消费,事件不会向上传递,如果返回 super.ontouchEvent,得看 clickable 是不是返回 true

onTouch 和 onClick 冲突

当我们 setOnTouchListener 且在 onTouch() 返回 true 表示事件被消费,setOnClickListener 的 onClick 不会执行我们设置了 setOnClickListener/setOnTouchListener,mListenerInfo 就不会为空,如果 li.mOnTouchListener.onTouch(this, event)true,则 result 为 true!result 短路就不会执行 onTouchEvent(event) 方法,而这个方法在 ACTION_UP 中回调 onClick。

down 事件分析

事件都是以 DOWN 开始,UP 事件结束,中间多个 MOVE 事件,所以我们先从 DOWN 事件开始分析DOWN 事件进来,会先重置 mGroupFlags 变量,disallowIntercept 标志位为 false,进入onInterceptTouchEvent 来判断是否拦截。
看下 requestDisallowInterceptTouchEvent,表示请求父类不要拦截事件当 View 设置 requestDisallowInterceptTouchEvent 为 true 的时候,mGroupFlags = mGroupFlags|FLAG_DISALLOW_INTERCEPT,使得 disallowIntercept = mGroupFlags|FLAG_DISALLOW_INTERCEPT & FLAG_DISALLOW_INTERCEPT != 0,disallowIntercept 标志位为true,不会执行 onInterceptTouchEvent,父 View 也不会拦截子 View但是当前事件是 DOWN 事件,requestDisallowInterceptTouchEvent 是无效的。会调用 resetTouchState 重置mGroupFlags 使得 disallowIntercept 为 false,进入 onInterceptTouchEvent 来判断是否拦截
- 未被拦截:intercepted 为 false,事件分发给子 View 处理
- 被拦截:intercepted 为 true,会跳过 if (!canceled && !intercepted)首次事件处理,mFirstTouchTarget == null,调用 dispatchTransformedTouchEvent,传入的 child 为 null,调用 super.dispatchTouchEvent(transformedEvent) 进入 View 的 dispatchTouchEvent 方法。完成了 DOWN 事件分发和处理后,再次分发 MOVE 事件,还是从 ViewGroup 的 dispatchTouchEvent 方法开始,而 MOVE 事件是可以反复调用此方法的,MOVE 事件不进行分发,直接找 DOWN 事件确定的对象

冲突解决方法

- 外部拦截法 (在 ViewGroup 中对事件进行拦截)重写 parentView 中的 onInterceptTouchEvent- 内部拦截法(ViewGroup 不拦截,子 View 需要事件就消耗掉,否则交给父 View 处理)重写 parentView 的 onInterceptTouchEvent重写 childView 的 dispatchTouchEvent

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

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

相关文章

Spring 注解 和SpringMVC注解

Spring和Spring MVC是两个紧密相关但又不同的框架,它们都使用一系列注解来简化开发。以下是Spring和Spring MVC中一些常用的注解: ### Spring 注解: 1. **Component:** - 用于将类标记为Spring容器中的组件,由Spr…

2024年腾讯云新用户专属优惠活动及代金券活动汇总

腾讯云作为国内领先的云计算服务提供商,一直致力于为用户提供优质、高效的服务。为了更好地满足新用户的需求,腾讯云在2024年推出了一系列新用户专属优惠活动和代金券活动。本文将为大家详细介绍这些活动,帮助大家更好地了解和利用这些优惠。…

Gogs - 管理协作者

Gogs - 管理协作者 References 仓库设置 管理协作者 权限设置 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Android 13(T) - Media框架(2)- libmedia

这一节学习有两个目标: 1 熟悉Android Media API的源码路径与调用层次 2 从MediaPlayer的创建与销毁了解与native的串接 1、源码路径 Media相关的API位于:frameworks/base/media/java/android/media,里面提供有MediaPlayer MediaCodecList M…

基于机器学习的视觉应用

基于图像处理的视觉应用1 基于机器学习的视觉应用, 又名:机器视觉之从调包侠到底层开发(第3天) PS:这个系列是准备做从Python一些接口应用开发,openCV基础使用场景原理讲解,做一些demo案例讲解&#xff0…

代币合约 ERC20 Token接口

代币合约 在以太坊上发布代币就要遵守以太坊的规则,那么以太坊有什么规则呢?以太坊的精髓就是利用代码规定如何运作,由于在以太坊上发布智能合约是不能修改和删除的,所以智能合约一旦发布,就意味着永久有效,不可篡改…

如何解决NAND系统性能问题?-- NAND接口分类

三、NAND接口 NAND闪存接口是连接主机控制器与NAND存储芯片的通信桥梁,负责命令、地址和数据的传输。典型的NAND闪存接口包括一组I/O线(通常为8条或更多)用于数据传输,以及若干控制信号线。 基本接口信号: Chip Enable…

QT-发送HTTP请求/QNetworkAccessManager

本文使用QT发送一个媒体类型为application/json的post请求,步骤如下: 1.首先创建一个QNetworkAccessManager类,并设置url和请求参数 2.发送请求,发送之后会返回一个QNetworkReply对象的指针 3.调用connect函数创建一个信号槽&…

JS常用的几种事件

JavaScript常用的几种事件有: 点击事件:当用户点击某个元素时触发,常用于按钮、链接等交互元素。事件名称为"click"。 javascriptbutton.addEventListener(click, function() { alert(按钮被点击了!); }); 鼠标移动事…

服务器 Linux常见指令

删除文件 删除文件 单个删除:rm -f 文件名 rm -f 2018_12_26.stderrout.log.060121612 --执行完成即将这个文件删除删除文件夹 rm -rf 路径/目录名tar命令 压缩 tar -cvf [文件名].tar [文件目录] //打包成.tar文件 tar -jcvf [文件名].tar.bz2 [文件目录]…

吲哚及其衍生物:连接肠道炎症与神经健康的隐秘调节剂

谷禾健康 你敢相信吗?从粪便中提取出具有强烈粪臭味的物质,当用酒精稀释上千倍后,脱胎换骨变成了一种香味。这就是一种吲哚衍生物——3-甲基吲哚(又名粪臭素) 吲哚,是所有花香类原精的关键成分,这种物质在低剂量1-3%浓…

Springboot的redisTemplate究竟用的是哪个bean

在自动装配一个RedisTemplate对象时,我时常有疑惑用到的究竟是spring自带的还是我们自定义的。 不定义自定义bean时 Autowired private RedisTemplate redisTemplate; 上面的redisTemplate实际上是RedisAutoConfiguration类中通过redisTempate这个bean自动装载的…

如何利用RPA做UI自动化测试对传统自动化的降维打击

写在前面 RPA软件一开始的目的并不是自动化测试,而是要把电脑上面几十个、上百个常用的软件,通过机器人流程自动化来打通,通过一个软件来控制几十个、上百个软件。而这个过程,其实覆盖了软件自动化测试。 所谓降维打击&#xff0c…

【第二课课后作业】书生·浦语大模型实战营-轻松玩转书生·浦语大模型趣味Demo

目录 轻松玩转书生浦语大模型趣味Demo课后作业1. 基础作业1.1 使用 InternLM-Chat-7B 模型生成 300 字的小故事:1.2 熟悉 hugging face 下载功能,使用 huggingface_hub python 包,下载 InternLM-20B 的 config.json 文件到本地 2. 进阶作业2.…

强化学习应用(三):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

【Docker】数据卷挂载以及宿主机目录挂载的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Docker实战》。🎯🎯 &…

[JVM] Java类的加载过程

Java类的加载过程 在Java中,类的加载是指在程序运行时将类的二进制数据加载到内存中,并转化为可以被JVM执行的形式的过程。类的加载过程主要包括以下几个步骤: 加载(Loading):通过类的全限定名,…

P1042 [NOIP2003 普及组] 乒乓球————C++

目录 [NOIP2003 普及组] 乒乓球题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 解题思路Code运行结果 [NOIP2003 普及组] 乒乓球 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 …

HTML 链接 图片引入

文章目录 链接图片引入 链接 准备工作 新建一个名为link.html和suc.html suc.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>显示结果</title></head><body>注册成功...&l…

电子学会C/C++编程等级考试2020年12月(三级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:完美立方 形如 a^3= b^3 + c^3 + d^3的等式被称为完美立方等式。例如 12^3= 6^3 + 8^3 + 10^3 。 编写一个程序,对任给的正整数 N (N≤100),寻找所有的四元组 (a, b, c, d),使得 a^3= b^3 + c^3 + d^3 ,其中 a,b,c,d均大于 11, …