【Android】WMS(三)Window的更新UI刷新

news2024/11/28 3:45:05

Window的更新

在这里插入图片描述

在 Android 中,窗口的更新是一个非常常见的事情。比如,在使用 App 过程中,需要弹出键盘窗口或者切换横竖屏时,就会发生窗口的更新。

首先,当需要更新窗口时,会调用 WindowManagerupdateViewLayout() 方法来设置参数,并将参数设置到对应的 View 上。WindowManager 的实现类为 WindowManagerImpl,但它实际上并没有做太多的工作,而是直接委托给了 WindowManagerGlobal(WMGlobal)

接下来,在 updateViewLayout() 方法中,使用来同步更新,然后通过传入的 view 参数找到其在 DecorView 中的索引值,再根据索引值找到对应的 ViewRootImpl 对象。

由于所有的窗口都是由 ViewRootImpl 来管理的,因此我们需要调用 ViewRootImpl 的 setLayoutParams() 方法,来将新的布局参数设置到对应的 ViewRootImpl 上。在这个过程中,旧的布局参数会被移除,新的布局参数会被添加进去。

UI刷新

在这里插入图片描述

帧率

在移动设备上,为了确保操作界面的流畅性和用户体验,帧率(FPS)是非常重要的一个因素。帧率表示在一秒钟内刷新的图像帧数,表示界面绘制的速度,而较高的帧率则意味着更加流畅的操作体验。

在 Android 系统中,默认帧率为 60 FPS,在每 16 毫秒的时间内绘制一次界面。为了保证界面的流畅性,系统会通过 VSYNC 信号来同步帧率和屏幕刷新,从而保证在一个 VSYNC 周期内最多只绘制一帧,避免了过度绘制和渲染导致 CPU 和 GPU 的过度占用,优化了系统性能和电池寿命。因此,我们可以使用一些调试工具来监测帧率和绘制时间,以便了解系统的性能并进行优化。

请求刷新

在 Android 中,UI 的刷新并不是由应用程序自行决定的。相反,它需要向同步信号服务申请同步信号以进行刷新操作。应用程序在进行 UI 绘制之前必须先向系统申请同步信号,在得到系统同意后,才能开始实际的视图重绘。

在请求刷新时,应用程序会向系统注册一个回调函数,以便在同步信号到达时可以接收通知。当系统接收到请求时,它会分配一个时间片来准备重绘操作,并在准备完成后向应用程序发送同步信号。此时,应用程序的回调函数就会被调用,以便进行实际的重绘操作。

通过这种方式,Android 系统可以保证应用程序的刷新操作在正确的时机进行,并且不会占用过多的系统资源。同时,它还能够优化系统性能和电池寿命,提高用户体验。

UI的View刷新流程

View的内容变化会调用invalidate()方法,该方法会设置 ViewRootImpl 中的 mDirty 参数,表示需要重绘的区域。

紧接着在调用 invalidate() 方法后,ViewRootImpl 会执行 scheduleTraversals() 方法准备进行绘制操作。在此期间,ViewRootImpl 同时请求VSYNC信号。此请求的目的是为了在下一次刷新屏幕的同时绘制 View 并保证画面的流畅度。

调用 scheduleTraversals() 方法后,会将一个 mTraversalRunnable 对象加入 Choreographer.CALLBACK_TRAVERSAL 的队列中等待 VSYNC 信号到来。

在 VSYNC 信号到来后,Choreographer 会执行 mTraversalRunnable 中的 run() 方法,接着执行 doTraversal() 方法,进而调用 performTraversals() 方法。

在 performTraversals() 方法中,首先对输入的触摸事件进行处理,接着开始调用 View 的 measure()layout() draw() 方法,依次完成测量、布局和绘制的过程。

在绘制出来之后,ViewRootImpl 会通过Surface或者SurfaceView将界面显示到屏幕上。

UI绘制流程

在这里插入图片描述

UI局部刷新

UI局部刷新(Partial UI Refresh)指的是只对某些View进行重绘刷新,而不需要对整个屏幕进行重新绘制。实际上,在 Android 中实现 UI 局部刷新是非常重要且常见的需求,在某些情况下,仅针对一个或几个 View 进行重绘能够提升应用程序的性能和响应速度。

在 Android 中,实现 UI 局部刷新主要有两种方式:

invalidate(Rect dirty) 方法:该方法可以指定需要刷新的矩形区域,从而只会对该区域内的 View 进行重绘刷新。这种方式适用于实现需求简单的 UI 局部刷新,但是需要手动计算出需要刷新的矩形区域。

ViewOverlay:ViewOverlay 是一种可以叠加在 View 上方显示的视图,它的作用是为某个具体的 View 添加覆盖层。通过使用 ViewOverlay,我们可以在不影响原有 View 布局的情况下,动态添加、删除遮盖层,并且只需对遮盖层进行重绘刷新。这种方式可以实现比较复杂的 UI 局部刷新需求。

需要注意的是,对于使用了硬件加速的 View,使用 invalidate() 方法进行局部刷新时,可能会因为硬件加速的缓存机制导致 invalidate() 方法不会生效。此时,可以使用 setLayerType(View.LAYER_TYPE_SOFTWARE, null) 方法关闭硬件加速,或者使用 View.setClipChildren(false) 方法将 View 的父容器取消裁剪,从而避免这个问题。

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

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

相关文章

基于Java+SpringBoot+Vue前后端分离校园闲置物品交易网站

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

POI in Action

POI 组件依赖 按需引入对应依赖 (给出官方的指引) 组件作用Maven依赖POIFSOLE2 FilesystempoiHPSFOLE2 Property SetspoiHSSFExcel XLSpoiHSLFPowerPoint PPTpoi-scratchpadHWPFWord DOCpoi-scratchpadHDGFVisio VSDpoi-scratchpadHPBFPublisher PUBpoi-scratchpadHSMFOutloo…

MCP1501基准电源系列输出电容为什么不能超过300P

1 介绍 在我们通常理解中基准的输出电容需要在100nF以上,才能有较好的性能输出,为什么MCP1501系列官方推荐输出负载电容不能超过300P呢 2 原理分析 如下是MCP1501手册中标注的,最大负载电容不能超过300pF,超过300pF容易振荡 MC…

JavaSE-01【初识Java】

文章目录 JavaSE-01【初识Java】第一章 Java开发序言1.1 Java语言概述1.2 Java语言的发展史1.3 Java语言应用领域1.4 掌握Java可以从事的工作 第二章 Java开发环境2.1 JDK、JRE、JVM2.2 Java虚拟机 (JVM)2.3 JDK JRE JVM三者的关系2.4 JDK的下载2.5 JDK的安装2.6 JDK环境变量的…

华为认证 | HCIE-Big Data-Data Mining 认证即将升级新版本!

华为认证HCIE-Big Data-Data Mining V3.0(中文版)预计将于2023年6月30日正式对外发布。 为了帮助您做好学习、培训和考试计划,现进行预发布通知,请您关注。 01 发布概述 基于“平台生态”战略,围绕“云-管-端”协同的…

使用PowerDesigner生成数据库设计文档

第一步:将现有得数据表通过PowerDesigner导入sql脚本(同时保证注释不丢失及name code comment) 1:依次点击File->Reverse Engineer->Database... 2.弹出弹窗对模型进行命名,同时在DBMS下拉选择框中需要选择自己对应的数据库类型&#…

Vue+SpringBoot打造生活废品回收系统(附源码文档)

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师,全栈领域优质创作者。 一、摘要…

数据库管理-第八十一期 保姆级EMCC搭建教程(20230606)

数据库管理 2023-06-06 第八十一期 保姆级EMCC搭建教程1环境说明2 EMCC安装前准备3安装EMCC4 进入EMCC5 添加主机与数据库5.1 添加主机5.2 添加数据库 6 注意事项总结 第八十一期 保姆级EMCC搭建教程 EMCC,全称Oracle Enterprise Manager Cloud Control&#xff0c…

巨详细的一份Python学习路径文档--如何精准的入手Python

当谈论学习Python编程时,有许多不同的途径和资源可供选择。为了帮助你建立起一个学习Python的有效路线,下面是一个包含基本步骤和关键资源的建议。 「请注意,这只是一个指南,你可以根据自己的兴趣和学习风格进行调整。」 简章 「确…

《水经注地图服务》新版发布

《水经注地图服务》已发布新版,请各位新老客户到官方网站下载新版试用或升级更新。 当前版本主要对Windows 64位版和Linux版进行升级,从该版开始,Windows32位版将不再升级。 服务管理界面 版本号 当前版本号:5.0.0-beta Window…

通过 Python 封装关键词搜索阿里巴巴商品api接口

以下是使用 Python 封装关键词搜索阿里巴巴商品列表数据的步骤: 使用 requests 库向阿里巴巴搜索接口发送 HTTP 请求,可以使用 GET 或 POST 方法,请求参数中应包含搜索关键词、每页展示数量、当前页码等信息。 解析返回的 response 中的 HTM…

论文解读:Towards Open World NeRF-Based SLAM,迈向开放世界的NeRF-SLAM

论文:https://arxiv.org/pdf/2301.03102.pdf 摘要: 神经辐射场(Neural Radiance Fields,NeRF)在同时定位与地图构建(Simultaneous Localization and Mapping,SLAM)任务中提供了灵活…

【Leetcode】跳跃游戏 | Jump Jump,Greedy Greedy

55 跳跃游戏 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 不断更新当前能够到达的范围maxReach class Solution {public boolean canJump(int[] nums) …

云原生到底是个啥玩意?从云端降临的超级技术:云原生

目录 福利:文末分享云原生相关全套资料哦 一、云计算?云原生? 二、云原生带来什么好处 7个字:隔离、弹性、自动化。 三、云原生的基础知识 四、云原生中最重要的概念 1、虚机 2、容器 3、容器编排 4、VPC 5、微服务&am…

Lambda表达式 函数式接口 Stream流

目录 一. Lambda表达式 1. 函数式编程思想概述 2. Lambda的优化 3. Lambda的格式 标准格式: 参数和返回值: 省略格式: 4. Lambda的前提条件 二. 函数式接口 1. 概述 格式 FunctionalInterface注解 2. 常用函数式接口 Supplier接口 Consumer接口 Function接口 P…

2023大厂精选 Java 面试真题集锦(含答案),面试一路开挂

前言 跳槽求职时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来,期间也没有准备充分,到底是因为技术原因,影响自己…

poll函数和epoll函数族

一、IO多路复用 二、多路复用的实现方式 select函数 int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); poll函数 int poll(struct pollfd *fds, nfds_t nfds, int timeout); epoll 函数族 epoll_create epoll_wai…

(6.2-6.8)【大数据新闻速递】

关 注gzh“大数据食铁兽”,了解更多的大数据快讯 【华为曹冲:聚焦四大战略方向,共建数智金融未来】 6月7日,华为全球智慧金融峰会2023在上海举行。会上,华为数字金融军团CEO曹冲发表《智领睿变,共建数智…

Redis学习总结(一)

Redis 持久化机制 RDB 持久化 Redis RDB(Redis DataBase)是Redis的一种持久化方式。它可以将Redis中的数据快照存储在硬盘上,并在需要时重构该数据快照。因为可以在磁盘上存储和重构数据快照,所以RDB是一种非常高效的Redis数据备…

用于语义分割的动态焦点感知位置查询

文章目录 Dynamic Focus-aware Positional Queries for Semantic Segmentation摘要本文方法Dynamic Focus-aware Positional QueriesEfficient High-resolution Cross-attentionFocus-aware Segmentation Framework 实验结果 Dynamic Focus-aware Positional Queries for Seman…