当前位置: 首页 > news >正文

Android焦点机制结合WMS

文章前提:

  • 了解WMS基本作用
  • 了解window的概念,phoneWindow,rootViewImpl
  • 了解view的事件分发

开始:

讲三件事情:

  1. window的创建,更新
  2. 焦点的更新
  3. 事件的分发

Window的创建,更新:

window的创建:

最终都是通过和WMS通信完成的。

WMS管理着window的增,删,改以及window层级的管理(Z-order的堆栈管理...),因此window的创建我们自然就联想到了WMS。

performLaunchActivity()方法中,也就是在 Activity 的启动过程中的几乎最后一步执行:

调用activity.attch()方法

 

创建PhoneWindow

handleResumeActivity()处理onResume(),因此在performLaunchActivity后面执行在这个方法中调用了addView方法:

这个addView由WindowManagerGloal实现,其中创建RootViewImpl,并进行setView()

WindowManagerGloal:

这个root就是RootViewImpl,接下来到setView方法中

通过addToDisPlayAsUser方法调用,

在其中调用WMS的addWindow方法:

此时终于到了WMS的addWindow方法中,这里面做了四件事:

  • 窗口检查
  • token处理
  • windowState的创建
  • displayContent的创建和配置

执行完后,由WMS直接和SurfaceFlinger通信,进行显示,此时我们的window就显示出来了。

window的更新:

什么情况下会出现window的更新?

键盘出现,窗口需要重新计算布局并更新显示内容。

只是api执行的不同,不过逻辑同样,app进程发起更新请求,由WindowManagerGlobal进行处理,这个类和WMS通过IWindowSession进行通信,实现更新操作。

焦点的更新:

焦点的基本概念

  • 焦点(Focus):UI元素获得焦点后,能够接收用户输入事件,如按键和触摸事件。
  • 默认焦点:当一个Activity启动时,系统会自动为某个可交互的控件设置默认焦点。

焦点的获取和失去

  • 获取焦点:一个视图可以通过调用requestFocus()方法来请求获取焦点。
  • 失去焦点:一个视图可以通过调用clearFocus()方法来主动放弃焦点。

焦点的移动

  • 键盘导航:用户可以使用方向键(如上、下、左、右)在可获得焦点的视图之间导航。
  • Tab顺序:使用android:nextFocusUp, android:nextFocusDown, android:nextFocusLeft, android:nextFocusRight属性来指定焦点导航的顺序。

处理焦点冲突

  • focusable属性的合理使用:确保只有需要交互的视图设置为可获得焦点。
  • 自定义焦点顺序:通过XML属性或代码来明确设置焦点导航顺序,避免焦点在不合理的视图之间跳转。

OK,开始焦点机制的部分:

文章前提:

  • 了解InputManagerService
  • 了解WMS
  • 了解RootViewImpl

想要使得焦点更新,需要操作:

分为两种:

  • requestFocus()
  • 有外部点击

requestFocus:

会通过Binder,通过WMS,WMS中会判断焦点是否更新。

外部点击:

SurfaceFlinger接收到点击之后,通过InputChannel,发送给WMS,WMS内持有所有window的集合,会判断是否需要更新window焦点,通过WMS,surfaceFlinger得知需要更新的window之后,直接通知对应的window的RootViewImpl,通知DecorView,通知Activity,通知PhoneWindow,通知DecorView,然后继续向下分发......下面就是老生常谈的view事件分发机制了......

相关文章:

Android焦点机制结合WMS

文章前提: 了解WMS基本作用了解window的概念,phoneWindow,rootViewImpl了解view的事件分发 开始: 讲三件事情: window的创建,更新焦点的更新事件的分发 Window的创建,更新: wi…...

Hive分区和分桶

分区: 根据某一列进行进行划分存储,常用的有时间分区; 查询数据时只需要扫描特定的分区数据,不需要全盘扫描,节省时间, 方便数据归档和清理 创建分区表 create table table_name( col1 int, col2 string ) partition …...

GPT-5的到来~

IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。“像 GPT-4 这样的系统则更像是聪明的…...

责任链模式(设计模式)

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理…...

计算机图形学入门20:加速光线追踪

1.前言 前文说了Whitted-style光线追踪技术的原理以及光线与平面的交点计算方式,对于现在应用最广的Polygon Mesh显式曲面来说,一个复杂场景中的多边形面总数可能达到千万甚至亿万以上,如果每个像素发射光线都和场景中每个平面进行求交点计算…...

sys.stdin对象——实现标准输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 sys.stdin是一个标准化输入对象,可以连续输入或读入文件所有内容,不结束,不能直接使用。输入完成后&am…...

嵌入式项目分享| 终极智能手表,全过程+全开源分享

这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…...

【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态

目录 操作系统中 运行状态 阻塞状态 进程状态转换 Linux系统中 查看进程状态 深度睡眠状态 T 暂停状态 Z 僵尸状态 孤儿状态 文章手稿 xmind: 引言 介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换…...

MySQL添加外键约束经典案例

1DDL建表语句 需要一个emp员工表和一个dept部门表 CREATE TABLE emp (id int NOT NULL AUTO_INCREMENT,name varchar(50) COLLATE utf8mb4_0900_as_ci NOT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,job varchar(20) COLLATE utf8mb4_0900_as_ci DEFAULT NULL CO…...

vue3监听器watch以及watchEffect的使用

一,watch()简介: 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数 watch()默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。 watch()一共有三个参数 第一个参数:侦听器的源,可以为以…...

modelsim做后仿真的一点思路

这是以TD_5.6.3_Release_88061生成的网表文件(其他工具生成的网表文件类似),与modelsim联合进行门级仿真的样例,时序仿真与门级仿真的方法类似,只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…...

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表,或者所有分区表的所有分区,以便执行进一步的操作,比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…...

如何在 qmake(QtCreator)中指定 Mac 平台

在 Qt 项目文件(.pro 文件)中设置针对 Mac OS 的配置项。通常情况下,我们可以使用如下方式为 Windows 和 Unix 系统分别添加源文件: win32 {SOURCES += hellowin.cpp } unix {SOURCES += hellounix.cpp }虽然 Mac OS 是类 Unix 系统,但有时我们仍然需要区分它和 Linux 系…...

day39动态规划part02| 62.不同路径 63. 不同路径 II 343. 整数拆分 (可跳过)96..不同的二叉搜索树 (可跳过)

**62.不同路径 ** 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 题目讲解 | 视频讲解 class Solution { public:int uniquePaths(int m, int n) {// 确定数组及其下标的含义int dp[101][101] {0}; //到达i,j的点有多少条路径// 确定递推…...

声场合成新方法:基于声波传播的框架

声场合成是指在房间内的麦克风阵列上,根据来自房间内其他位置的声源信号,合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务,因为它是一种成本效益高的方法,用于数据生成以替代真实的数据收集,后…...

鸿蒙文件操作事前准备

13900001,沙箱13900002 首选授权 module授权配置 "requestPermissions": [{ "name": "ohos.permission.CAMERA",}, { "name": "ohos.permission.READ_MEDIA",}, { "name": "ohos.permission.WR…...

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?

文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化:ChatGPT在金融策略与算法交易中的实践》亮点内…...

C#面:C#属性能在接口中声明吗?

在C#中,接口是一种定义了一组方法、属性和事件的类型。在接口中,只能声明方法、属性和事件的签名,而不能包含字段、构造函数或实现代码。因此,C#属性不能直接在接口中声明。 然而,你可以在接口中定义属性的签名&#…...

区块链的历史和发展:从比特币到以太坊

想象一下,你住在一个小镇上,每个人都有一个大账本,记录着所有的交易。这个账本很神奇,每当有人买卖东西,大家都会在自己的账本上记一笔,确保每个人的账本都是一致的。这就是区块链的基本思想。而区块链的故…...

input()函数——输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入,将所有的输入按照字符串进行处理,并返回一个字符串,input()函数的…...

Git 查看某个文件的修改记录

Git 查看某个文件的修改记录 git log – filename filename为全路径 git log – aa/bb/cc/dd/ee/ff.c...

高性能计算终极指南:使用LIKWID工具套件进行性能分析与优化

高性能计算终极指南:使用LIKWID工具套件进行性能分析与优化 【免费下载链接】likwid Performance monitoring and benchmarking suite 项目地址: https://gitcode.com/gh_mirrors/li/likwid 在当今的高性能计算(HPC)领域,性能监控与分析是提升计算…...

基于Milvus混合检索与Java SpringBoot的全栈实现

阿里云有数千份产品文档,腾讯云有上万页技术规格,华为云的价格清单每天都在更新,开发者如何在浩如烟海的资料中,3秒内找到“ECS g6.2xlarge在华东区的按量计费价格”?传统关键词搜索解决不了语义理解,纯向量…...

MySQL数据库基础3--(函数)完

一、聚合函数聚合函数包括COUNT()、SUM()、AVG()、MAX()和MIN()。当需要对表中的记录求和、求平均值、查询最大值和查询最小值等操作时,可以使用聚合函数。GROUP BY关键字通常需要与聚合函数一起使用。COUNT()用来统计记录的条数;SUM()用来计算字段的值的…...

AI代码助手Cursor与Django全栈开发:十倍速构建Web应用实战

1. 项目概述:当AI代码助手遇上Django全栈开发如果你是一名独立开发者、初创团队的技术负责人,或者正在学习全栈开发,那么你一定对如何高效构建一个现代化的Web应用感到头疼。从环境配置、数据库设计、API接口开发到前端页面渲染,每…...

DRAM读干扰机制:RowHammer与RowPress的实验研究

1. DRAM读干扰问题概述DRAM(动态随机存取存储器)是现代计算系统中最主要的主存技术,其可靠性和安全性对整个系统的稳定运行至关重要。然而,DRAM存在一个被称为"读干扰"(Read Disturbance)的固有缺…...

AgentGPT 二次开发指南:API 调用、功能扩展与场景定制

AgentGPT 二次开发指南:API 调用、功能扩展与场景定制 1. 引入与连接:为什么你需要二次开发 AgentGPT? 1.1 开场:从一个真实需求说起 2023年3月AgentGPT横空出世时,很多人第一次感受到了自主智能体的魔力:输入一个「帮我做一份奶茶店的创业商业计划书,包含市场调研、成…...

学妹问降完AI重复率反涨10个点怎么办?这款降AI工具同时降AI率重复率

学妹问降完AI重复率反涨10个点怎么办?这款降AI工具同时降AI率重复率 学妹凌晨发来的紧急求助 3 月 24 号凌晨 1:17 学妹发来消息:「学姐我刚送知网测——AI 率从 65% 降到 9% 过了!但重复率从 18% 涨到 28% 不达标了!这怎么办」…...

Potrace实战指南:5分钟掌握位图转矢量的开源神器

Potrace实战指南:5分钟掌握位图转矢量的开源神器 【免费下载链接】potrace [mirror] Tool for tracing a bitmap, which means, transforming a bitmap into a smooth, scalable image 项目地址: https://gitcode.com/gh_mirrors/pot/potrace 还在为位图放大…...

DLSS Swapper终极指南:5分钟快速上手游戏性能优化神器

DLSS Swapper终极指南:5分钟快速上手游戏性能优化神器 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾为游戏中的DLSS版本过旧而烦恼?是否厌倦了手动下载、替换DLSS文件的繁琐过程&…...