Android基础-事件分发机制

在Android系统中,事件分发机制是处理用户交互事件的核心机制。当用户与设备进行交互,如点击、滑动屏幕时,这些动作会被系统捕获并转化为相应的事件(如MotionEvent),随后这些事件需要通过一系列的处理和传递,最终到达能够处理这些事件的视图(View)组件。这一过程就是Android的事件分发机制。

一、事件分发机制概述

Android的事件分发机制是一个从顶层到底层的逐层传递的过程,主要涉及到三个层级:顶层的Activity/Window、中间层的ViewGroup、底层的View。简单来说,当用户在屏幕上触发一个事件时,这个事件会首先通过Activity的dispatchTouchEvent()方法进行处理,然后传递给顶层的Window,Window内部会创建一个DecorView来接收触摸事件,接着DecorView将事件传递给根布局ViewGroup,ViewGroup再递归遍历所有的子View,通过调用每个子View的dispatchTouchEvent()方法,依次传递触摸事件。最终,如果某个子View消费了事件(返回true),那么事件传递就终止,其它子View将不再收到事件;如果没有子View能够消费事件,或者所有子View都返回false,那么事件会继续向上传递给父ViewGroup,直至到达Activity的onTouchEvent()方法进行处理。

二、事件分发流程详细分析

事件产生的源头

在Android中,事件产生的源头主要是用户的触摸操作。当用户触摸屏幕时,会产生一个MotionEvent对象,该对象包含了触摸事件的详细信息,如发生触摸的位置、时间、历史记录、手势动作等。主要发生的Touch事件有四种:MotionEvent.ACTION_DOWN(按下View,所有事件的开始)、MotionEvent.ACTION_MOVE(滑动View)、MotionEvent.ACTION_CANCEL(非人为原因结束本次事件)、MotionEvent.ACTION_UP(抬起View,与DOWN对应)。任何事件列都是以DOWN事件开始,UP事件结束,中间可能有无数的MOVE事件。

Activity的事件分发流程

Activity作为事件分发的入口,其内部包含两个关键的方法:dispatchTouchEvent()和onTouchEvent()。当一个事件发生时,首先会将点击事件传递到Activity中,执行dispatchTouchEvent()进行事件分发。在这个方法中,首先会调用Window的superDispatchTouchEvent()方法,将事件传递给Window进行处理。在Window内部,会创建一个DecorView来接收触摸事件,并调用其dispatchTouchEvent()方法继续传递事件。如果DecorView无法处理该事件(返回false),则事件会回传给Activity的onTouchEvent()方法进行处理。

ViewGroup的事件分发流程

ViewGroup作为View的特殊子类,是一组View的集合,也是Android中所有布局的父类。在事件分发过程中,ViewGroup起到了承上启下的作用。当事件传递到ViewGroup时,会首先调用其dispatchTouchEvent()方法进行事件分发。在这个方法中,会首先调用onInterceptTouchEvent()方法判断是否拦截该事件。如果返回true,则表示拦截该事件并交给ViewGroup自己处理(调用onTouchEvent()方法);如果返回false或者没有重写该方法(默认返回false),则表示不拦截该事件并继续传递给子View处理。如果子View能够消费该事件(返回true),则事件传递终止;否则事件会回传给ViewGroup的onTouchEvent()方法进行处理。

View的事件分发流程

View是所有UI组件的基类,常见的Button、TextView等控件都继承自View。在事件分发过程中,View是最终的接收者和处理者。当事件传递到View时,会调用其dispatchTouchEvent()方法进行事件分发。由于View没有子View(除非是自定义View且内部包含其他View),因此这个方法的实现相对简单:直接调用onTouchEvent()方法处理事件。如果View能够消费该事件(返回true),则事件传递终止;否则事件会回传给父ViewGroup的onTouchEvent()方法进行处理。

三、总结

Android的事件分发机制是一个复杂而高效的过程,它通过Activity、ViewGroup、View三个层级的协同工作,将用户触发的触摸事件准确地传递给能够处理这些事件的视图组件。在这个过程中,事件分发机制的灵活性使得系统能够处理各种不同类型的事件,并将事件分发和处理的责任分担给了不同的组件,从而提高了系统的性能和灵活性。同时,通过合理地设置事件的拦截和处理策略,我们可以实现更加复杂和丰富的用户交互体验。

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

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

相关文章

Redux实现状态管理

在使用 Redux 的应用中,实现状态管理通常涉及以下几个步骤: 创建 Action:Action 是一个简单的 JavaScript 对象,它描述了一个行为,通常有一个 type 字段来表示行为类型。 创建 Reducer:Reducer 是一个纯函…

C# WPF入门学习主线篇(十二)—— Canvas布局容器

欢迎来到C# WPF入门学习系列的第十二篇。在之前的文章中,我们介绍了WPF布局管理的基本概念以及常见的布局容器。本篇博客将详细介绍其中一种最基本的布局容器——Canvas布局容器。通过本篇文章,您将学习如何使用Canvas布局容器来精确控制子控件的位置&am…

二叉树的算法题目

二叉树的遍历题目 二叉树遍历一般包含三种分别为:根左右、左根右、左右根(又称为前序遍历、中序遍历、后序遍历) 方法一:使用递归遍历 方法二:使用迭代使用栈 我们以左根右(中序遍历&…

【SpringBoot】项目搭建基本步骤(整合 Mybatis)

搭建 SpringBoot 项目有两种方式:使用 IDEA、或者在 Spring 官网下载。 1. IDEA 创建 打开 IDEA 后,英文版请点击 File -> New -> Project -> Spring Initialer。 中文版请点击 文件 -> 新建 -> 项目 -> Spring Initialer。 在打开的…

【Proteus8.16】Proteus8.16.SP3.exe的安装包,安装方法

下载: 链接:https://pan.baidu.com/s/14ZlETF7g4Owh8djLaHwBOw?pwd2bo3 提取码:2bo3 管理员打开proteus8.16.SP3.exe一路装就行了,许可证选Licence2.lxk,点安装后关闭,然后继续装完。 然后打开Patch-Proteus-8.16-…

力扣2972.统计移除递增子数组的数目 II

力扣2972.统计移除递增子数组的数目 II 类似1574. 核心都是定一边最大能取到的位置定一边 移一边当我们确定左右端点位置时 [i1,j]是一定要删除的然后i 1这里可以一直缩小到0也就是总共 i 2个子数组 class Solution {public:long long incremovableSubarrayCount(vector&l…

【Ardiuno】ESP32单片机初试点亮LED小灯

之前用的Ardiuno的主板做过一些简单的开发实验,按照相关说明还是很容易进行操作的。最近看了ESP32可以有wifi的功能,也就买来实验一下。 ESP32的主板开发环境安装,按照说明的安装下载程序总是报错,又上网搜索半天最后按照CSDN上某…

docker-compose部署RocketMq

docker-compose部署RocketMq 先看看官网:https://rocketmq.apache.org/zh/docs/4.x/quickstart/03quickstartWithDockercompose 尝试了在docker-compose文件中启动命令位置直接设置jvm内存大小,无法正常启动 command: sh mqbroker -c /home/rocketmq/…

平衡二叉树详解

目录 平衡二叉树的定义 平衡二叉树的基本操作 查找 插入 AVL树的建立 平衡二叉树的定义 平衡二叉树仍然是一棵二叉查找树,只是在其基础上增加了平衡的要求,也就是其左右子树的高度之差的绝对值不超过1。 在定义树的结构时需要加入一个变量height&…

uc_os操作练习

目录 一、CubeMX配置 二、获取uc-os源码 三、代码移植 四、代码修改 五、总结 六、参考资料 一、CubeMX配置 首先进入CubeMX,,新建工程,选择STM32F103C8T6芯片,照例配置好RCC和SYS。 然后配置GPIO输出,这里选择P…

2024 年最新 Python 基于百度智能云实现文字识别 OCR 详细教程

文字识别 OCR 概述 文字识别OCR(Optical Character Recognition)提供多场景、多语种、高精度的文字检测与识别服务,多项ICDAR指标居世界第一。广泛适用于金融服务、财税报销、法律政务、保险医疗、快递物流、交通出行、教育培训等场景&#…

Android面试题汇总-Jetpack组件

一、Navigation 当然可以。Android Navigation组件是一个用于在Android应用中管理导航的框架,它简化了Fragment之间的交互和数据传递。 (1)Navigation组件的核心概念 NavHostFragment: 作为容器,承载应用中的目的地&#xff08…

赶紧收藏!2024 年最常见 20道分布式、微服务面试题(四)

上一篇地址:赶紧收藏!2024 年最常见 20道分布式、微服务面试题(三)-CSDN博客 七、请解释服务发现和服务注册的概念。 服务发现(Service Discovery)和服务注册(Service Registration&#xff0…

C++ 11 【线程库】【包装器】

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:C修炼之路⏪   🚚代码仓库:C高阶🚚   🌹关注我🫵带你学习更多C知识   🔝🔝 目录 前言 一、thread类的简单介绍 get_id…

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作:SD卡烧录工具入门书籍推荐:BeagleBone cookbookBeagleBone概况? 重要路径 官方例程及脚本路径:/var/lib/cloud9 系统镜像下载 疑问&am…

C 语言实现在终端里输出二维码

Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…

SpringBoot+Vue图书管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户管理员 功能截图

人工智能在交通与物流领域的普及及应用

文章目录 &#x1f40b;引言 &#x1f40b;自动驾驶 &#x1f988;自动驾驶汽车 &#x1f421;应用现状 &#x1f421;技术实现 &#x1f421;实现过程及代码 &#x1f40b;智能交通管理 &#x1f988;应用现状 &#x1f988;技术实现 &#x1f988;实现过程及代码 &…

嵌入式基础知识

ARM 内核版本号 架构&#xff1a;如ARMv7&#xff0c;是ARM公司确定的&#xff0c;ARMv7是32位(见到的芯片多是该架构)&#xff0c;ARMv8是64位但也支持32位。该架构定义了处理器的基本指令集、体系结构以及支持的技术特性。 ARM SoC版本号 内核&#xff1a;如Cortex-A8&…

老黄一举揭秘三代GPU!打破摩尔定律,打造AI帝国,量产Blackwell解决ChatGPT全球耗电难题

近日&#xff0c;老黄手持Blackwell向全世界展示的那一刻&#xff0c;全场观众沸腾了。 这是迄今为止世界上最大的芯片&#xff01; 用老黄的话来说&#xff0c;它是「全世界迄今为止制造出来的最复杂、性能最高的计算机。」GPT-4o深夜发布&#xff01;Plus免费可用&#xff01…