Android面试View的绘制流程

Posted Rose J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android面试View的绘制流程相关的知识,希望对你有一定的参考价值。

View的绘制流程简介

view的绘制流程主要为measure,layout,draw三个阶段

View与window的逻辑结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVsaa9EY-1621012211151)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620483256221.png)]

对应于ViewRootImpl(替代ViewRoot)类,它是连接WindowMannager和DecorView的纽带,View的三大流程均是通过ViewRoot完成的,当activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联在ViewRootImpl里面performTraversals()分发

Activity和window和view 的关系

activity是系统可视化交互组件,四大组件都由AMS统一管理生命周期,事实上它的职责只是生命周期的管理,处于单一职责的原则,那势必需要将activity和其上的视图View进行解耦,那么久引入window的概念,它是个抽象类,对于activity来说,它的具体实现类是PhoneWindow,在activity执行attach的时候,会创建一个PhoneWindow对象,PhoneWindow作为装载根视图DecorView的顶级容器,activity通过setContentView实际上是调用了PhoneWindow来创建DecorView,并解析xml布局加载到DecorView的contentView部分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPKu6QZy-1621012211154)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620456520007.png)]

Activity和Window是什么时候建立联系的呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7nOwFMXj-1621012211158)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620456856588.png)]

scheduleLaunchActivity

–>handleLauchActivity(初始化了sWindowMannagerService

)–>perforLaunchActivity

–>activity.attach

–>new PhoneWindow(this,window) + 将window和windowMangerService绑定:同时,此时完成了window和activity的绑定

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mER5Whxq-1621012211164)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620458006926.png)]

在activityThread 调用lauchactivity的时候,会调用activity的attach函数,在attach函数里面将view和activity绑定将window和wms进行绑定,绑定完成之后,才会调用,instrumentation的callactivity的Oncreate函数,这个时候才调用activity生命周期的onCreate函数,所以window和activity建立联系是在attch的时候,真正显示视图的是在onCreate方法里面的setContentView,这个时候才会把我们layout的xml布局加载到ContentView来

ContentView只是DecorView的一部分,而DecorView是系统添加上去的。

ViewRootImpl

ViewRootImpl的根本目的是用来管理整个View的流程,就是通过performTraversals这个方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8VCpMyIO-1621012211167)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620487819005.png)]

performTraversals方法,首先会调用performMeasure,这个方法会调用顶级view的measure函数

子容器会重复父容器的measure过程,如此反复就完成了整个树的遍历,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3escIHtS-1621012211167)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620487792818.png)]

view的measure函数会调用onMeasure函数 ,performLayout和performDraw,也亦是如此,唯一不同的是draw中调用的是dispatchDraw

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NtB86GD-1621012211170)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620488159355.png)]

然后performTraversals中会调用performLayout事件,然后会调用host也就是view的layout方法,调用里面的onLayout方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9h9owIrm-1621012211173)(C:\\Users\\Lenovo\\AppData\\Roaming\\Typora\\typora-user-images\\1620488295656.png)]

然后会在performTraversals中执行performDraw方法,然后同样的逻辑,调用View的Draw函数,然后Draw函数调用onDraw函数

通过ViewRootImpl --> 调用performTraversals中 :performMeausre–>performLayout–>performDraw

从而对应到onMeasure–>onLayout–>onDraw

View的绘制流程总结

这里写图片描述

如图所示,performTraversals会依次调用performMeasure、performLayout和performDraw三个方法,这三个方法分别完成顶级View的measure、layout、draw这个三个流程。其中:

1.perfromMeasure中会调用measure方法,在measure方法中又会调用onMeasure方法,在onMeasure方法中会对所有的子元素进行measure过程,这个时候measure流程就从父容器传递到子元素中了,这样就完成了一次measure过程。接着子元素会重复父元素的measure过程,如此反复就完成整个View树的遍历。

2.performLayout的传递流程和performMeasure是一样的。

3.performDraw的传递过程是在draw方法中通过dispathDraw来实现的,本质上并没有区别。

Measure过程决定了View的宽高,Measure完成以后,可以通过getMeasuredWidth和getMeasuredHeight方法来获取到View测量后的宽高,在几乎所有的情况下它都等于View的最终宽高,这仅仅是在代码规范的前提之下。
layout最终决定了View的四个顶点的坐标和实际View的宽/高,完成以后,可以通过getTop、getBottom、getLeft、getRight来拿到View的四个顶点坐标位置,并可以通过getWidth和getHeight来得到View的最终宽高

draw过程决定了View的显示,只有draw方法完成以后View的内容才会最终显示在屏幕上

draw过程

1.绘制背景background.draw(canvas)

2.绘制自己(ondraw)

3.绘制children(dispatchDraw)

4.绘制装饰(onDrawScrollBars)

以上是关于Android面试View的绘制流程的主要内容,如果未能解决你的问题,请参考以下文章

2019年Android岗位BAT等大厂面试题

android view绘制 面试

android组件化开发,12个View绘制流程高频面试题,实战解析

android组件化开发,12个View绘制流程高频面试题,实战解析

android基础-viewgroup的测量,布局,绘制

Android面试官:“来给我讲讲View绘制?”