View体系(下)|青训营笔记

简介: 熟悉完 View 的基础,了解完其分发流程,事件分发的传递规则。我们需要深入理解 View 的工作流程,包括绘制原理以及三大方法的流程,洞悉其原理和实现。

熟悉完 View 的基础,了解完其分发流程,事件分发的传递规则。我们需要深入理解 View 的工作流程,包括绘制原理以及三大方法的流程,洞悉其原理和实现。

1.webp.jpg

页面绘制流程

页面如何展示到屏幕

当我们在 ActivityonCreate() 中调用 setContentView() 来设置根布局的时候,这个方法是一步步新建了一个 PhoneWindow ,再然后 PhoneWindow 就是以 DecorView 作为一个根部的 View 来添加内容。那么 DecorView 是如何被加载到 Window 的呢?

事实上,Activity 在执行了 onCreate() 的相关方法之后,会跳转到执行 onResume() 的相关方法,DecorView 就是在这个阶段被加载到 Window 的。

1.webp.jpg

页面绘制的总体流程如上图

最左侧的序列,最后完成的是 addView(),所添加的 View 其实是 DecorView。在管理着 Activity 生命周期的 onResume() 时期的 handleResumeActivity()方法中,该方法在成功的发起了 onResume() 方法之后,就会开启这个序列。这也是为什么在 onResume() 执行的时期,Activity 才会可见,因为这个时候才会把顶层的  DecorView 添加进去。

接着是 ViewRootImpl 这个方法的序列。在 addView() 里面,ViewRootImpl 会调用 setView() 来设置 DecorView,和调用 requesLayout() 来请求开始绘制流程。这时候并非一请求就会开始绘制了,何时开始绘制是由下一个序列的 Choregrapher 所决定的。

到达 Choregrapher(舞蹈编导) 管理的这个序列,从名字我们就可以了解到这是一个管理的方法。它的主要作用就是管理什么时候执行绘制,在其调用了回调之后,页面才会开始执行绘制,到最后的调用三大方法。

在最后的一个序列中,调用 WindowManagerService 方法之后,addVindow() 才会被调用来展示页面到屏幕。

页面多久绘制一次

1.webp.jpg

我们在 Activity 中设置了布局文件之后,还会有很多页面的改动,动画的执行。那么是一执行到这些改动,页面就会立刻响应变化吗?有多个改动的话,是一个个排队执行改动吗?

其实是和上文提到的一样,这些改动是由 Choregrapher 来管理的。那么它如何管理的呢。这涉及到一个帧率的概念,譬如 60 帧就是指屏幕每秒会刷新60次。而页面的改动,统一就是在每一帧刷新的时候进行更新改动的。

我们可以查看上图,在每个时间片内,蓝色阶段是 CPU 执行 MeasureLayout  Draw 这些个方法,绿色阶段则是 GPU 对这些的合成。然后到达了 VSync 这个时间的时候,就是屏幕刷新来展示这些新的或者更改后的页面了。那么有没有 CPU + GPU 执行的时间超时的情况呢,当出现这个情况的时候,就是出现了丢帧现象,说明我们需要对业务进行优化了。

附:页面执行绘制的渲染流程

UI渲染流程

1.webp.jpg

渲染流程

1.webp.jpg



相关文章
|
运维 Serverless API
函数计算FC报错问题之报错{"detail":"Not Found"}如何解决
函数计算(Function Compute,FC)是一个事件驱动的全托管计算服务,允许用户编写并上传代码,而无需管理服务器运行和维护;在使用过程中,可能会遇到各种报错,本合集聚焦于函数计算FC常见的报错问题,提供一系列的故障排查指导和解决建议,帮助用户优化云端函数执行
922 0
|
JavaScript
Vue给Element UI的el-popconfirm绑定按钮事件
Vue给Element UI的el-popconfirm绑定按钮事件
|
6月前
|
机器学习/深度学习 传感器 人工智能
AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡
AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡
264 3
AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡
|
7月前
|
分布式计算 Hadoop 数据挖掘
“Hadoop整不明白,数据分析就白搭?”——教你用Hadoop撸清大数据处理那点事
“Hadoop整不明白,数据分析就白搭?”——教你用Hadoop撸清大数据处理那点事
324 34
|
6月前
|
机器学习/深度学习 人工智能 运维
探讨AI数字人软件系统的开发与部署策略
随着科技发展,人工智能成为经济转型的关键驱动力,AI数字人软件系统在各行业广泛应用。本文探讨其开发与部署策略,助力企业和开发者参考。开发策略包括需求分析、技术选型、模块化设计、数据驱动及安全性保障;部署策略涵盖硬件环境、软件配置、分布式与云端部署以及运维保障,推动系统智能化与稳定性提升。
|
10月前
|
JavaScript 前端开发 索引
40个JS常用使用技巧案例
大家好,我是V哥。在日常开发中,JS是解决页面交互的利器。V哥总结了40个实用的JS小技巧,涵盖数组操作、对象处理、函数使用等,并附带案例代码和解释。从数组去重到异步函数,这些技巧能显著提升开发效率。先赞再看后评论,腰缠万贯财进门。关注威哥爱编程,全栈开发就你行!
294 16
|
存储 开发工具 git
git工具使用教程全讲解
本文介绍了版本控制的概念及其重要性,详细对比了多种版本控制工具,如VSS、CVS、SVN和Git,重点讲解了Git的基本使用方法、工作原理及与SVN的区别。此外,文章还介绍了GitHub、GitLab和Gitee等流行的代码托管平台,以及如何在这些平台上注册账号、创建和管理仓库。最后,文章还提供了如何在IntelliJ IDEA中配置和使用Git的具体步骤。
441 1
|
关系型数据库 MySQL Java
对比下 datax 的 OceanBase/MYSQL 不同数据同步方案的效率差异 || 聊聊参数 rewriteBatchedStatements
对比下 datax 的 OceanBase/MYSQL 不同数据同步方案的效率差异 || 聊聊参数 rewriteBatchedStatements
|
存储 Java
Java中BigDecimal怎样取反
在上述示例中,`number.negate()`会将BigDecimal对象 `number`的值取反,并将结果存储在新的BigDecimal对象 `negated`中。
494 0

热门文章

最新文章