面试:事件拦截相关问题

news2025/1/21 18:46:22

Q1:分发的事件被view消耗了,后续事件是如何快速找到这个view的?

ViewGroup不拦截事件又是如何将事件分发给子View?

带着问题重学Android事件分发 - 掘金

我们之前经常背的八股文:

当你手指触摸到屏幕这时候ViewGroup首先接收到的是一个down事件,如果不拦截则会将事件分发到子view中,首先会遍历循环所有的子控件调用 dispatchTransformedTouchEvent 函数,也就是子控件的 dispatchTouchEvent 方法,由子控件继续执行事件的分发,这时候如果 child 消费了事件 dispatchTouchEvent 会返回true,接着会执行 addTouchTarget 函数和将 alreadyDispatchedToNewTouchTarget 标记设置为 true,alreadyDispatchedToNewTouchTarget 标记表示是否有子控件消费了这个事件,newTouchTarget 默认为 null 也就是在有 child 消费事件后才会创建一个节点。

addTouchTarget 函数中首先将 child 封装成一个 target 对象,TouchTarget 是一个单链表的数据结构在这里 ViewGroup 中的 mFirstTouchTarget 指向“封装child的target”,从这里可以看出如果有子控件消费了事件那么 mFirstTouchTarget 必然不为 null

TouchTarget(面试)

ViewGroup 里 TouchTarget 对象可以看做在事件分发序列中第一个消费了事件的控件对象的封装,除了记录消费事件的 View 对象还具备在 move 事件到来时快速定位具体的 子View 来处理事件,当一个子View消费了事件时 dispatchTransformedTouchEvent 返回 true ,接着调用 addTouchTarget 函数新建一个 TouchTarget 节点

Q2:OnTouchListener、onTouchEvent、OnClickListener的优先级

1、看下view的dispatchTouchEvent源码:

    public boolean dispatchTouchEvent(MotionEvent event) {
        //...
            ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                result = true;
            }
 
            if (!result && onTouchEvent(event)) {
                result = true;
            }
        }
 
        //...
 
        return result;
    }

可以非常清楚看到,先执行的是onTouchListener的onTouch方法,如果返回true则代表事件被消费掉,则不会往下走到onTouchEvent中;相反,如果没有消费则才往下走到onTouchEvent中。

2、接着看view的onTouchEvent方法:

可以很清楚看到,OnTouchListener是执行在onTouchEvent之前的,OnTouchListener优先级高于onTouchEvent,如果程序注册了onClickListener,则会执行onClickListener的onClick方法 

总结如下:

OnTouchListener --> onTouchEvent --> OnLongClickListener/OnClickListener

1、view在执行dispatchTouchEvent的时候先要去判断该view是否有touchListener和执行TouchListener的onTouch方法的返回值。

2、TouchListener的onTouch方法返回false,事件继续传递在dispatch方法中调用了同级的onTouchEvent方法

3、然后在onTouchEvent方法中的UP事件中判断是否注册有onClickListener,有就执行onclick方法。

 android中的事件传递和处理机制 - fuly - 博客园

那天有人问我,Android 的事件到底是怎么来的?

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

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

相关文章

BUUCTF Misc 隐藏的钥匙 另外一个世界 FLAG 神秘龙卷风

隐藏的钥匙 下载文件 使用010 editor工具查看 查找flag 将内容复制到base64在线 得到flag flag{377cbadda1eca2f2f73d36277781f00a} 另外一个世界 下载文件 使用010 eitor查看 看到了一串二进制,进行二进制转换字符串 得到flag flag{ko…

XCTF1-web unseping

unseping 题目描述 进入场景 源代码分析&#xff0c;反序列化场景 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_…

FPGA 20个例程篇:18.SD卡存放音频WAV播放(上)

第七章 实战项目提升&#xff0c;完善简历 18.SD卡存放音频WAV播放&#xff08;上&#xff09; 在最后一章里&#xff0c;我们来做几个实战项目&#xff0c;一方面是对前面学习知识的一种回顾&#xff0c;另一方面这几个小项目也非常贴近实际工程&#xff0c;其中例程“SD卡存…

CENTOS安装 graylog4.39

我们直接开始 基础环境和java sudo yum install epel-release 并安装带有 sudo yum install pwgenyum install java-1.8.0-openjdk-headless.x86_64 MONGODB 安装数据库 vi /etc/yum.repos.d/mongodb-org.repo[mongodb-org-4.2] nameMongoDB Repository baseurlhttps://rep…

【STL】map容器

map 作为关联式容器的一种&#xff0c;map容器存储的都是pair对象&#xff0c;也就是用pair类模板创建的键值对。其中&#xff0c;各个键值对的键和值可以是任意数据类型&#xff0c;包括C基本数据类型、使用结构体或类自定义的类型。 默认情况下&#xff0c;map容器选用std:…

vmware虚拟机centos7扩容

vmware先进行磁盘扩展 从原来的20G扩展到100G: 扩展磁盘时可能会遇到需要修复磁盘的情况: // 进入vmware安装目录cd D:\开发工具\VMWare\ // 修复, 其中.vmdk文件为虚拟机磁盘文件vmware-vdiskmanager -R "F:\VM_Centos\CentOS 7 64 位.vmdk" 扩展成功&#xff1…

mysql死锁介绍以及解决

什么是死锁 死锁是2个线程在执行过程中&#xff0c; 因争夺资源而造成的相互等待的现象&#xff0c;若无外力作用&#xff0c;它们将无法推进下去。 死锁产生的4个必要条件 互斥条件 指进程对所分配的资源进行排他性使用&#xff0c;即一段时间内某资源只有一个进程占用&#…

TC277的Ovc功能

TC277的Ovc功能 文章目录前言Data Access Overlay (OVC)<br>特点和功能概述数据访问重定向目标内存地址Online Data Acquisition (OLDA) SpaceOverlay MemoriesLocal MemoryEmulation MemoryDSPR & PSPR MemoryGlobal Overlay ControlGlobal Overlay Control Synchro…

控制算法-模型预测MPC

本文记录一下MPC控制算法的学习过程和自己的理解&#xff0c;初步接触控制算法&#xff0c;理解肯定不是很完善&#xff0c;重在记录思考的过程。 背景 随着自动驾驶技术以及机器人控制技术的不断发展及逐渐火热&#xff0c;模型预测控制(MPC)算法作为一种先进的控制算法&…

LeetCode 202. 快乐数

题目链接&#xff1a;https://leetcode.cn/problems/happy-number/ 思路如下&#xff1a; 由题目可知&#xff0c;nnn 的取值在 [1,231−1][1, 2^{31}-1][1,231−1] 的范围内&#xff0c;在 [1,2147483647][1, 2147483647][1,2147483647] 这个区间里面&#xff0c;平方和最大…

【博客544】golang pprof性能调试:寻找memory瓶颈

golang pprof性能调试&#xff1a;寻找memory瓶颈 1、前置 pprof的使用与输出列解析看姐妹篇&#xff1a;golang pprof性能调试&#xff1a;寻找cpu瓶颈 2、引入pprof到程序中&#xff0c;以调试memory瓶颈 给程序加入&#xff1a; import _ "net/http/pprof"go…

Java 8 集合 Stream

Java 8 是一个成功的版本&#xff0c;新增的内容很实用。比如大家熟悉的 lamda 表达式&#xff0c;集合的 Stream&#xff0c;等等。 本文讲讲 Stream 的使用。 Stream 是什么&#xff1f; Stream 将要处理的集合看做流&#xff0c;然后方便的对流做操作&#xff0c;比如筛选…

node日志log4js库使用示例

在node开发或者electron项目开发中&#xff0c;我们可能需要记录日志的功能&#xff0c;便于我们出错排查问题。今天介绍node中的日志库log4js。 log日志记录&#xff0c;一般需要配置日志记录的级别&#xff0c;日志输出类型&#xff0c;日志格式等信息。log4js可以在初始化的…

ssh免密登陆

文章目录一、免密登陆1、生成密钥对2、将公钥拷贝到所创建的虚拟机上3、测试免密登陆成功没有二、遇到免密登陆失败的解决办法解决办法1、修改机器名&#xff0c;去掉.novalocal后缀2、重新做免密登录一、免密登陆 ssh密钥登录比密码登录安全&#xff0c;主要是因为他使用了非…

Spring - BeanPostProcessors 扩展接口

文章目录PreBean的生成过程org.springframework.beans.factory.config.BeanPostProcessor 介绍ApplicationContext注册Bean PostProcessor源码解析AbstractApplicationContext#refreshAbstractApplicationContext#registerBeanPostProcessorsPostProcessorRegistrationDelegate…

InnoDB底层存储结构探秘

一 innoDB 为什么不用平衡二叉树 计算机存储层次结构 计算机存储设备一般分为两种&#xff1a;内存储器(main memory)和外存储器(external memory)。 内存储器为内存&#xff0c;内存存取速度快&#xff0c;但容量小&#xff0c;价格昂贵&#xff0c;而且不能长期保存数据(在…

动物大全和动物识别系统毕业设计,动物大全和动物AI识别系统设计与实现,动物识别系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置&#xff1a;设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&a…

第七届NVIDIA Sky Hackathon项目报告书

系列文章目录 数据集收集和标注情况 1.1ASR语音数据集收集和标注情况 1.2CV图像数据集收集和标注情况进行模型的训练 2.1进行ASR模型的训练 2.2进行CV模型的训练在Jetson平台进行部署和推理 3.1部署和推理ASR模型 3.2部署和推理CV模型优化UI界面 文章目录系列文章目录1. 数据集…

详解BFS,Dijkstra算法,Floyd算法是如何解决最短路径问题的

目录 1.BFS算法 2.Dijkstra算法 3.Floyd算法 4.总结 1.BFS算法 G纲是个物流离散中心&#xff0c;经常需要往各个城市运东西&#xff0c;怎么运送距离最近——单源最短路径问题 各个城市之间也学要来往&#xff0c;相互之间怎么走距离最近&#xff1f;——每对顶点之间的最…

GNS3学习笔记

文章目录GNS3学习笔记一、GNS3支持的设备列表有哪些1、在安装根目录下 XXX\GNS3\appliances2、The NAT node 怎么使用二、GNS3使用错误汇总1、iosVL2 image(qemu平台)启动后进不去系统&#xff0c;一直重复进入开机界面三、参考链接1、GNS3应该使用那个模拟平台2、怎么集成VM到…