总体流程
Android 的 View 绘制流程是 GUI 系统的核心机制,其过程可概括为 测量(Measure)→ 布局(Layout)→ 绘制(Draw) 三个阶段,通过递归遍历 View 树实现界面渲染。以下是详细流程解析:
一、核心流程三阶段
-
测量(Measure)
-
布局(Layout)
-
绘制(Draw)
二、关键组件与机制
-
ViewRootImpl 与流程入口
-
MeasureSpec 的生成规则
三、优化策略
-
减少布局嵌套
-
延迟加载与复用
- 通过
ViewStub延迟加载复杂布局,减少初始渲染时间1。
- 通过
-
硬件加速与绘制缓存
-
避免过度绘制
- 使用开发者选项中的 Show GPU Overdraw 检测过度绘制区域,优化背景和透明度设置1。
1、 View树的绘制流程是谁负责的?
view树的绘制流程是通过ViewRootImpl去负责绘制的,ViewRoot这个类的命名有点坑,最初看到这个名字,翻译过来是view的根节点,但是事实完全不是这样,ViewRoot其实不是View的根节点,它连view节点都算不上,它的主要作用是View树的管理者,负责将DecorView和PhoneWindow“组合”起来,而View树的根节点严格意义上来说只有DecorView;每个DecorView都有一个ViewRoot与之关联,这种关联关系是由WindowManager去进行管理的;
\
2、 view的添加(创建)
view的绘制流程
* viewRootImpl.performTraversals()方法执行三大流程
(一)View的初始化
(二) 绘制的准备
(三) onMeasure
- 系统为什么要有measure过程?
view控件的宽高,在Android中有三种配置方式(具体值,match_parent,wrap_content),在view嵌套的时候,父控件和子控件的不同配置组合后,产生的实际结果不同,所有需要通过不断测量来计算出最终在屏幕上显示的宽高. - measure过程都干了点什么事?
由于Android有自适应尺寸机制,这样view的尺寸不好确定,通过测量view各种尺寸经过计算后换成在屏幕中显示的像素大小
1) 上图第1列分析:
DecorView本身没有measure方法,他继承自FrameLayout,FrameLayout继承自ViewGroup,ViewGroup继承自VIew,所以实际上调用的是view的measure方法
2) 上图第2列分析:
调用的是view的measure方法后,走DecorView的onMeasure方法,从而调用FrameLayout的onMeasure方法,然后通过调用measureChildWithMargins方法,该方法中通过getChildMeasureSpec方法获取参数,然后子view调用measure方法。当然measure方法可能会调用多次,因为布局的嵌套。到这里DecorView层的measure分析完了。
3) 上图第3列分析:
第三列对应我们调用的的setContentView(R.layout.xxxlinerlayout);方法,这里面以根布局为LinerLayout为例,进行后续的measure. LinearLayout会先根据mOrientation的横向排版还是竖直排版顺序,进行两个方向的测量。因为LinearLayout这个ViewGroup实际上就是把所有的子View按照横竖两个方向进行布局,最后的子view.layout,view如果是ViewGroup还需要重复该过程
onMeasure()方法中常用的方法:
- getChildCount():获取子View的数量;
- getChildAt(i):获取第i个子控件;
- subView.getLayoutParams().width/height:设置或获取子控件的宽或高;
- measureChild(child, widthMeasureSpec, heightMeasureSpec):测量子View的宽高;
- child.getMeasuredHeight/width():执行完measureChild()方法后就可以通过这种方式获取子View的宽高值;
- getPaddingLeft/Right/Top/Bottom():获取控件的四周内边距;
- setMeasuredDimension(width, height):重新设置控件的宽高
(四) onLayout
- 系统为什么要有layout过程?
- layout过程都干了点什么事?
- 上图省略了addview到
viewRootImpl.performTraversals()的过程
(五) onDraw
- 系统为什么要有draw过程?
- draw过程都干了点什么事?