页面绘制的源码探究 | 青训营笔记

91 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第30天

页面绘制的调用

onResume

在生命周期中,其作用的体现得比onCreate更加频繁。例如在用户正常使用过程中,突然切换了屏幕。应用界面不再被用户看到,将会调用onPause方法进入onStoped状态。重新切回屏幕后,会再调用onResume方法,绘制界面,重现显示在用户眼中

在handleResumeActivity方法中

image.png

窗口会被添加到窗口管理器

image.png

image.png 会获取到当前窗口的DecorView

image.png 由此获得viewRootImpl,这是绘制流程开始的起点 viewRootImpl是视图层次结构的顶部,实现视图和WindowManager之间所需的协议。这在很大程度上是以下内容的内部实现细节:

image.png

setView()方法

image.png 在方法体中调用requestLayout方法

image.png

image.png

在具体绘制的工程中,PerformMeasure是绘制起点,也是整体绘制流程的中后部分

image.png

image.png

它会尝试调用view的measure方法。这会测量视图及其内容,以确定测量的宽度和测量的高度。

image.png

performLayout会尝试调用mView的layout() 这会为为视图及其所有子视图指定大小和位置 这是布局机制的第二阶段。(第一个是测量)。在此阶段,每个父级调用其所有子级的布局来定位它们

image.png

image.png

performDraw()

image.png

传入Canvas参数的draw方法。手动将此视图(及其所有子视图)渲染到给定Canvas。在调用此函数之前,视图必须已完成完整布局

image.png

Canvas类是保存“draw”调用。要绘制一些东西,您需要4个基本组件:一个保存像素的位图、一个承载绘制调用(写入位图)的画布、一个绘制原语(例如,矩形、路径、文本、位图)和一个绘制(用于描述图形的颜色和样式)

image.png