View的事件分发机制

news2024/11/27 15:54:24

View的事件分发机制

View的事件分发机制主要分为三点

,第一点是Activity将点击事件分发给ViewGroup

第二点是ViewGroup将事件自己处理或者分发给子View

第三点便是子View自行处理,或者子View处理不了转交给ViewGroup

现在依次来看

Activity对点击事件的分发过程

Activity的dispatchTouchEvent主要是Activity内部的Window来完成,Window将判断

getWindow().superDispatchTouchEvent(ev)

是否为false,如果为false,则由Activity自己处理这个点击事件,即Activity调用onTouchEvent,而如果返回值为true,表示Window已经消费了该点击事件,不再继续向下传递,由PhoneWindow(PhoneWindow是Activity的实现类)处理后续的操作。

PhoneWindow将事件传递给DecorView,最后又通过DecorView传递给ViewGroup

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPojoUAk-1684655693454)(../../assets/流程图-导出 (1)].png)

ViewGroup对事件的分发过程

ViewGroup对事件的分发过程有3种可能性,一种是ViewGroup自己拦截的点击事件,然后自己处理了,还有一种是ViewGroup没有拦截事件,但是传递给了子View,但是子view没办法自己处理,最后又交给了ViewGroup处理。最后一种是ViewGroup没有拦截事件,传给子View,子View处理了

ViewGroup拦截事件

ViewGroup如果onInterceptEvent返回了true,则表示该事件被ViewGroup拦截住了,先判断有没有onTouchListener,如果有这个则调用里面的onTouch,没有则判断有没有onTouchEvent,如果里面设置了onClickListener则调用这个方法。

如果返回的是false,则传递给子View

但是onInterceptEvent并不是每次都会调用。

它有一个FLAG_DISALLOWINTERCEPT标记,这个标记会进行判断:

1.如果是一个ACTION_DOWN行为的话,它会在onterceptTouchEvent()里面进行判断是否进行拦截,如果不进行拦截的话且如果子View消费了该事件,则FLAG_DISALLOWINTERCEPT标记对于同一个事件的ACTION_MOVE,ACTION_UP等等都不再进行拦截了。

2.如果不进行拦截的话,且子View没有消耗该事件,ViewGroup仍然有可能拦截同一个事件序列内的其他动作。

3.如果进行拦截了当前事件,并不会将该事件传递给子View进行处理,同时也不会再接收该事件的后续动作。这意味着同一个事件序列内的其他动作**(如ACTION_MOVE、ACTION_UP等)**不会被该ViewGroup拦截。

所以ViewGroup的onInterceptEvent并不会一直调用

我们再看看ViewGroup把事件传递给子View吧

ViewGroup的传递

ViewGroup会对所有的子View进行一次遍历,并且对它们进行判断,

对于子View有以下几种判断:

1.如果子View的位置不在点击事件的坐标范围内或者子View不接收指针事件(如设置了不可点击或不可触摸),则跳过该子View。
2.如果子View已经在处理点击事件,即已经接收到ACTION_DOWN事件并在处理中,直接将触摸事件传递给该子View,并将点击事件标记为已经分发给子View处理。
3.如果子View还未处理点击事件,则调用dispatchTouchEvent()方法将点击事件传递给子View进行处理。
4.如果所有的子View都无法处理点击事件,或者ViewGroup没有子View,则ViewGroup会自己处理该点击事件。
总结起来,顶级View对点击事件的分发过程包括拦截判断、子View的遍历和分发。如果ViewGroup拦截了ACTION_DOWN事件,它会处理该事件;如果没有拦截,它会将事件传递给合适的子View进行处理,如果没有合适的子View,则自己处理该事件

View对点击事件的处理

这里的View不包含ViewGroup,因为ViewGroup的我们刚才已经讲过了

View没办法继续向下传递了,所以它就两种情况:

1.自己可以处理,然后把这个事件消耗了

2.自己没办法处理,然后转交给ViewGroup处理

就直接说View自己处理的

首先,View会判断是否存在onTouchEvent()OnTouchListenerOnClickListener等相关事件处理方法或监听器。
如果存在OnTouchListener,则会调用OnTouchListeneronTouch()方法,如果onTouch()方法返回true,表示该触摸事件已被消费,不再继续传递给其他处理方法或监听器。
如果存在OnClickListener,并且点击事件满足点击条件(如点击类型、点击位置等),则会调用OnClickListeneronClick()方法,并且事件被视为已经消费。
如果点击事件还未被消费,则会判断View的clickable和longClickable属性是否为true如果clickable为true,则视为该View可以接收点击事件并消费;如果longClickable为true,则视为该View可以接收长按事件并消费。
如果上述条件均不满足,或者View已经消费了点击事件,则事件会继续向上层父View传递,由父View或上层ViewGroup处理。
,则视为该View可以接收长按事件并消费。
如果上述条件均不满足,或者View已经消费了点击事件,则事件会继续向上层父View传递,由父View或上层ViewGroup处理。

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

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

相关文章

运用go语言的模板(template)写的第一个程序示例

一、模板(template)与渲染 模板其实就相当于一个简历模板,上面的格式都是已经确定了的渲染就是往对应的地方填写相应的数据 二、模板 模板文件通常定义为.tmpl和.tpl为后缀(也可以使用其他的后缀),必须…

手把手带你利用苹果手机使用美区礼品卡升级ChatGPT Plus,轻松搞定!

大家好,我是五竹。 昨天用苹果手机尝试了一下,借助App Store(苹果应用商店)升级 Plus,成功了!一共升级了三个号!有两个一气呵成,轻松搞定。最后一个可能触发风控了,但第…

OOB配对原理及应用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言一、OOB是啥?二、OOB配对实践总结 前言 本文先简单介绍OOB配对的流程,然后结合CC2652蓝牙芯片调试OOB配对 一、OOB是啥? OOB就是…

博客系统后端设计(六) -实现登录页面要求强制登录功能

文章目录 实现页面要求强制登录实现思路1.约定前后端交互接口2.实现后端代码3.修改前端代码 实现页面要求强制登录 当用户访问列表页/详情页/编辑页的时候,要求用户已经是登录的状态了, 如果用户还没登录,就会强制跳转到登录页面。 实现思路…

一文盘点PoseiSwap近期的生态利好

PoseiSwap 是 Nautilus Chain 上首个 DEX,其继承了 Nautilus Chain 的模块化、Layer3 以及 Zk-rollup 所带来的优势(TPS 在 2000),包括吞吐量、安全度、隐私性等。基于 Nautilus Chain,PoseiSwap 也将具备基于 Zk 的隐…

Ceph crush运行图

Crush map介绍 ceph集群中由monitor负责维护的运行图包括: Monitor map:监视器运行图osd map:osd运行图PG map:PG运行图Crush map:crush运行图Mds map:mds运行图 crush map是ceph集群物理拓扑的抽象&…

HTML、PHP实战:搭建一个网页登录页面。

一、实验环境。 MySQL5.7.26 FTP0.9.60 Apache2.4.39 我这里用的是PHPstudy小皮一键搭建的。 数据库 二、登录页面。 登录页面前端代码 文件名&#xff1a;denglu.html <html> <head> <meta charset"UTF-8"> <title>登录界面</ti…

StarRocks 极速全场景 MPP 数据库介绍及使用

一、简介 StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。既支持从各类实时和离线的数据源高效导入数据&#xff0c;也支持直接分析数据湖上各种格式的数据。兼…

Linux基本指令3

目录 一.基本常用指令 指令1&#xff1a;find命令&#xff1a; 指令2&#xff1a;which命令&#xff1a; 指令3&#xff1a;alias命令&#xff1a; 指令4&#xff1a;whereis which&#xff0c;find&#xff0c;whereis这三个搜索命令的区别&#xff1a; 指令5&#xff…

Vue初始

一、Vue的概述 Vue 发音类似 view Vue 游雨溪 鱿鱼须 鱿鱼须不懂Vue Vue历史 Angular React Vue 2013 Seed 2013 Seed命名为Vue 2014 Vue正式发布 0.8 - 0.10 2015 6.13 0.12 2015下半年 vue-cli vueRouter vueX 版本好1.0 vue正式跨入大众 渐进式框架(JQuery) 2016国…

[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解

[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解 _wakeup()及php序列化反序列化序列化字符串结构分析_wakeup()的利用 解题思路伪属性数量绕过 解题姿势总结 _wakeup()及php序列化反序列化 序列化是指将数据结构或对象转换为可传输或可存储的格式的过…

14.Kafka系列之K8S部署集群

1. 部署方式选择 基于Kafka3.X后的集群搭建方式主要分为两种&#xff0c;一种是基于Zookeeper管理方式&#xff0c;一种是基于KRaft模式&#xff0c;本文主要介绍Kafka-KRaft集群模式搭建 纠正文章1.Kafka系列之K8S部署单节点中基于Zookeeper方式的部署方式错误&#xff0c;其…

Godot引擎 4.0 文档 - 入门介绍 - Godot设计理念

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Godots design philosophy — Godot Engine (stable) documentation in English Godot设计理念 既然你已经了解了&#xff0c;让我们来谈谈 Godot 的设计。 每个游戏…

(转载)MATLAB智能算法30个案例分析(1)——遗传算法工具箱

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 1理论基础 1.1遗传算法概述 遗传算法(genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。遗传算法是把问题参数编码为染色体,再利用迭代…

第11届蓝桥杯Scratch选拔赛真题集锦

目录 一、编程题 第11届蓝桥杯Scratch选拔赛真题集锦 一、编程题 第 1 题 问答题 马克思的手稿 题目说明 背景信息: 马克思手稿中有一道趣味数学问题: 有30个人&#xff0c;其中有男人、女人和小孩。在一家饭馆吃饭共花了50先令;每个男人花了3先令&#xff0c;每个女人花了…

draw.io如何绘制带箭头的弧线

好长时间没有写draw.io相关的技巧了。今天再补充一个小技巧。 如何绘制像下图中蓝色的带箭头的弧线&#xff1f; 本来以为这个问题应该很简单&#xff0c;但是在仔细研究了很久之后我发现这个问题并没有想像得那么容易。 众所周知&#xff0c;draw.io中带箭头的线叫作“connect…

软件工程 | 期末复习习题

一、软件工程概述 1、选择 软件有无可行性和不可控性 软件工程是一门工程性学科 软件生存周期常见模型&#xff1a;螺旋模型、增量模型、瀑布模型、原型模型、融合模型、快速应用开发模型、敏捷模型 软件生存周期中时间最长的阶段是维护阶段 瀑布模型是一种软件生存周期模…

微搭低代码实现aad的sso

微搭低代码平台是一种可帮助您快速构建和部署应用程序的工具&#xff0c;而无需手动编写大量代码。要在微搭低代码平台上实现Azure Active Directory&#xff08;AAD&#xff09;的单点登录&#xff08;SSO&#xff09;&#xff0c;您需要遵循以下步骤&#xff1a; 注册Azure …

SpringBoot整合Mybatis(3000字)

SpringBoot整合Mybatis 文章目录 SpringBoot整合Mybatis依赖导入配置信息(application.yml)代码分层数据库(建库建表语句)各层代码enity:dao:service:controller: 测试 Mybatis分页查询和模糊查询分页查询:测试: 模糊查询:测试: Mybatis的分布查询多对一:测试:一对多: Mybatis的…

邮箱营销不再难:如何提高邮件的到达率和打开率?

在数字时代&#xff0c;电子邮件是企业与客户以及潜在客户沟通的重要渠道&#xff0c;是企业培养客户的有效方式之一。然而&#xff0c;由于每个人每天也要收到大量的垃圾邮件&#xff0c;所以企业必须确保在正确的时间将邮件传递给正确的人。在这篇文章中&#xff0c;小编将探…