Android开发之事件分发

news2024/11/16 2:43:17

#来自ウルトラマンゼロ(哉阿斯)

1 Activity 构成

平常布局展示在ContentView中。

2 事件分发

事件分发的本质其实就是把事件(Touch)封装成 MotionEvent 类,然后传递给 View 的层级处理。

MotionEvent 事件类型主要有下面四种:

MotionEvent.ACTION_DOWN按下事件(事件开始)
MotionEvent.ACTION_UP抬起事件(与 DOWN 对应)
MotionEvent.ACTION_MOVE移动事件
MotionEvent.ACTION_CANCEL结束事件

事件分发由三个方法协作完成:

  • dispatchTouchEvent():事件分发
  • onTouchEvent():消费事件、在 dispatchTouchEvent() 中调用
  • onInterceptTouchEvent():拦截事件、只有 ViewGroup 有、在 dispatchTouchEvent() 中调用

3 dispatchTouchEvent()

主要是负责分发,是安卓事件分发过程中的核心。

  • 返回 TRUE,则表明对事件已经处理,不用继续调用其余组件的分发方法,即停止分发
  • 返回 FALSE,则表明对事件不能处理,需要按照规则继续分发事件,在不复写该方法的情况下,除了一些特殊的组件,其余组件都是默认返回 False。

3.1 Activity#dispatchTouchEvent()

可以用以下伪代码说明:

public boolean dispatchTouchEvent(MotionEvent ev) {
    if (child.dispatchTouchEvent(ev)) {
        return true;//子 View 消费事件,返回 TRUE,让调用者知道该事件已被消费
    } else {
        return onTouchEvent(ev);//子 View 没有消费事件,调用自身的 onTouchEvent
    }
}
  • 事件经过传递后,事件被消费了(返回 TRUE),则 Activity 的分发方法也返回 TRUE,表示该事件已经被消费了。
  • 事件经过传递后,事件没有被消费(返回 FALSE),则 Activity 调用 onTouchEvent() 去处理。
  • onTouchEvent 消费事件,返回 TRUE(表示已消费事件),并作为 dispatchTouchEvent() 的返回值,让调用它的对象知道 Activity 消费事件。
  • onTouchEvent 没有消费事件,返回 FALSE(表示未消费事件),并作为 dispatchTouchEvent() 的返回值。让调用它的对象知道该 Activity 没有消费事件,需要继续处理。

3.2 ViewGroup#dispatchTouchEvent()

public boolean dispatchTouchEvent(MotionEvent ev) {
    if (!onInterceptTouchEvent(ev)) {
        return child.dispatchTouchEvent(ev);//不拦截,则传给子 View 进行分发处理
    } else {
        return onTouchEvent(ev);//拦截事件,交由自身 onTouchEvent 方法处理
    }
}
  • 返回 FALSE(不拦截),则交给子 View 去调用 dispatchTouchEvent() 方法
  • 返回 TRUE(拦截),则调用 ViewGroup 对象 onTouchEvent(ev) 方法处理。

3.3 View#dispatchTouchEvent()

public boolean dispatchTouchEvent(MotionEvent ev) {
    //listener 不为空,调用 onTouch方法
    if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
        return true;//若onTouch方法返回TRUE,消费事件,则 dispachtouTouchEvent返回 TRUE,让其调用者知道该事件已被消费,可见 setOnTouchListener 优先级比较高。
    }
    return onTouchEvent(ev);//没有消费事件,则调用对象自身的 onTouchEvent() 处理。
}
  • onTouch() 返回 TRUE,则 dispatchTouchEvent 也会返回TRUE,表示消费该事件。
  • onTouch() 返回 FALSE,或者 mOnTouchListener 为空,调用自身的 onTouchEvent() 处理,是否消费事件,可以由其返回值判断。

4 onInterceptTouchEvent

该方法是 ViewGroup 独有的,对事件进行提前拦截。一般情况下,该方法是默认返回 FALSE,表示不拦截。 如果自定义 ViewGroup 希望拦截事件,不希望事件传递,可以覆写该方法,返回 TRUE,即可阻止向下的传播过程。

子 View 也可以通过 requestDisallowInterceptTouchEvent 来设置 FLAG_DISALLOW_INTERCEPT 标志位,禁止 ViewGroup 拦截除了 DOWN 之外的事件。

  • 返回 TRUE,则会将事件拦截,自身的 onTouchEvent 处理。

  • 返回 FALSE,则继续传递给子 View 执行分发流程。

5 onTouchEvent

对事件进行处理。

  • 返回 TRUE 表示已经处理了事件,
  • 返回 FALSE 表示没有对事件进行处理,需要继续传递事件。一般情况下,默认为 FALSE。在 View 的onTouchEvent 方法中,如果设置了 setOnClickListenter、setOnLongClickListene 处理,返回 TRUE。

6 总结

  • 当事件产生之后,传递顺序:Activity -> PhoneWindow -> 顶层 ViewGroup
  • 事件传递中一般考虑 ViewGroup 的 onInterceptTouchEvent(),一般情况下我们不会重写 dispatchTouchEvent()。
  • 对于根 ViewGroup,事件首先传递到 dispatchTouchEvent():
    • onInterceptTouchEvent() -> TRUE,则表示拦截事件,这个事件就由 onTouchEvent()
    • onInterceptTouchEvent() -> FALSE,则表示不拦截事件,这个事件会交给它的子 View dispatchTouchEvent()
    • 如果事件传递到底层的 View,View 是没有子View的,就会调用 View 的 dispatchTouchEvent(),通常情况下,会调用 View 的 onTouchEvent() 处理事件。

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

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

相关文章

51单片机-第七节-DS1302实时时钟

一、DS1302介绍: 实时时钟芯片,可对年,月,日,周,时,分,秒计时,是一种集成电路。 二、DS1302原理: 1.寄存器定义: Command:操作模式…

MySQL:表的增删查改——CRUD(二)

本篇博客接上篇:MySQL:表的增删查改——CRUD(一)-CSDN博客 目录 1、查询(Retrieve) 1.1 条件查询:WHERE 1.1.1 比较运算符 1.1.2 逻辑运算符 1.1.3 查询语句的执行顺序 1.1.3 SQL代码示例…

小试牛刀-walletconnect二维码及交互

目录 1.编写目的 2.实现功能 3.功能详解 依赖组件 3.1 二维码生成 3.1.1 初始化SignClient 3.1.2 创建会话空间获取WC协议uri 3.1.3 生成二维码供用户扫描 3.1.4 等待扫描 3.2 发送交易事务 3.2.1 创建交易事务 3.2.2 向用户发送交易事务 3.3 签名事务 3.3.1 接收…

使用AI绘图工具生成风景图像的教程

随着人工智能技术的飞速发展,AI绘图工具在图像生成和艺术创作方面变得越来越强大,无论你是一个设计师、艺术家,还是仅仅对生成艺术感兴趣的爱好者,AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中,…

医疗设备漏费控制管理系统的必然性及未来发展性

医疗设备控费的必然性 医疗改革的要求 随着医疗改革的不断深入,原有的医药模式已经发生了改变。药品和耗材零差价的执行,使得医院需要寻找新的开源节流、降耗增效的方法。医疗设备控费系统的出现,正是为了满足这种管理需求。 控制成本和优…

【AI】人工智能核心三要素

上图来自甲子光年的资料,如有侵权,请联系删除。 在当今科技飞速发展的时代,人工智能(AI)作为引领未来科技变革的重要力量,正以前所未有的速度改变着我们的生活、工作乃至整个社会的面貌。人工智能之所以能…

文件Io编程基础

1. 标准I/O (stdio.h) stdio.h 是标准C库的头文件,包含了输入输出函数的声明。位置:/usr/include/stdio.h 2. 文件I/O操作步骤 打开文件: 使用 fopen 函数,返回 FILE* 指针。读/写操作: 使用 fread、fwrite、fgets、fputs、fprintf、fscan…

【SOC】SoC架构系统总线的QoS管理——QoS generator

#工具文档理解# QoS——Quality of Service 目录 一、概念 Master对于Latency的敏感性 流量控制和事务级概念 Splitting Pending order IDs 数据包创建和传输的QoS 序列化 一、概念 这一部分描述了QoS机制如何平衡不同发起者的流量访问,以适应互连的有限可…

都2024年了,SQL语句还需要手写吗?

前言 在当今的AI时代,数据库管理和SQL开发已不再是单调的编码过程。借助AI的智能化工具,数据库操作变得更加简洁高效,错误率也大大降低。特别是当AI与强大的数据库管理工具Navicat相结合时,开发者可以更加专注于数据的分析和应用…

home assistant 接入国家电网

一、安装加载项 在 配置 - 加载项 File editorAdvanced SSH & Web Terminal 二、安装state_grid 上传压缩包 在 File editor中,进入 homeassistant - custom_components 文件夹中,点击上传文件。 文件下载路径 https://download.csdn.net/downl…

密码学基础-身份认证

密码学基础-身份认证 概述 书信的亲笔签名;公文、证书的印章起到了核准、认证的功能。 如前文密码学基础-数据加密所述,信息安全少不了身份认证的话题。只有认证了信息的来源,我们才能知道这条信息是否是正确的,合法的&#xff…

如何让贵人一直帮你?

如果有贵人提携了你一把,牢记一定要抱住大腿。 如果一个段位比你高很多的贵人帮了你一个忙,他什么都不缺,他缺的也不是你这个层次的人能够给的了的,但你千万不要以为这个事儿就翻篇儿了。牢记一招,每隔半年给他汇报一下…

超声波眼镜清洗机有用吗?品质上等的超声波清洗机评选

超声波眼镜清洗机有用吗?眼镜是我们日常生活中不可或缺的配件,其卫生状况对健康至关重要。由于眼镜经常与外界环境接触,容易积聚细菌。为了有效解决这一问题,大家都纷纷选择使用超声波清洗机来进行彻底清洁。所以,超声…

C语言基础知识点(十三)结构体的深拷贝与浅拷贝

在C或C等语言中,结构体(Struct)是一种用户自定义的数据类型,它允许将不同类型的数据项组合成一个单一的类型。对于结构体的拷贝,存在深拷贝(Deep Copy)和浅拷贝(Shallow Copy&#x…

DataWhale市场博弈和价格预测

文章目录 市场博弈和价格预测任务数据出清价格的形成步骤代码运行 Task1:跑通baseline使用ABM估计市场出清价格转换耗煤量为机组报价保存结果为submit.csv Task2:时间序列挖掘ABM构建学习数据基本信息统计指标分析数据分布分时统计特征不同小时的总负荷和…

错误代码0x80004005:全面解析与解决策略

在Windows操作系统中,错误代码0x80004005是一个相当常见的提示,它通常表示一个未指定的错误或一个无法找到的错误。这个错误可能出现在多种场景中,包括软件安装、系统更新、网络连接、文件操作等。由于其普遍性和模糊性,理解和解决…

搭建链路追踪系统 Jaeger

搭建链路追踪系统 Jaeger 架构 架构图 架构设计 在设计以 Jaeger 为中心的链路追踪系统时,我们采用微服务架构模式。 Jaeger 作为核心追踪系统,负责收集、存储和展示分布式追踪数据。Elasticsearch 作为后端存储,提供数据的持久化和高效…

网鼎杯之unfinish

题目来源:网鼎杯 2018 题目描述:SQL 问题:给一个页面,如何判断其有漏洞 通过awvs扫描得知存在 register.php 注册页面,并且注册界面存在SQL盲注漏洞。 题目提示SQL,在注册页面测试无果,且发现输…

解决Ubuntu报“无法解析域名cn.archive.ubuntu.com“问题

今天在Ubuntu系统上,使用sudo apt update命令,进行更新时,弹出"无法解析域名 cn.archive.ubuntu.com"问题,如图(1)所示: 图(1) 弹出"无法解析域名 cn.archive.ubuntu.com" 错误 出现这种现象的原因…

C++并发编程(一):线程基础

简介 本文学习的是 b 站 up 恋恋风辰的并发编程教学视频做的一些笔记补充。 教程视频链接如下:线程基础:视频教程 文档链接如下:线程基础:笔记文档 理论上直接看 up 提供的笔记文档即可,我这里主要是记录一些我自己…