android开发艺术探索,笔记
4.1 ViewRoot 和 DecorView
View的绘制的三大流程:measure、 layout 、draw
ViewRoot
对应于ViewRootImpl
类,它是连接WindowManager
和DecorView
的纽带,View的三大流程均是通过ViewRoot
来完成的,在ActivityThread
中,当Activity
对象被创建完毕后,会将DecorView
添加到Window中,同时会创建ViewRootImpl
对象,并将ViewRootImpl
对象和DecorView
建立关系
View的绘制流程是从ViewRoot
的performTraversals
方法开始的,他通过measure、 layout 、draw
三个过程才能最终将一个View绘制出来
measure
:用于测量View的宽和高
layout
:用来确定View在父容器中的放置位置
draw
:负责将View绘制在屏幕上
performTraversals 会一次调用performMeasure 、performLayout、performDraw 三个方法,这三个方法分别完成顶级View 的 measure、 layout 、draw
这三大流程,其中在performMeasure 中会调用measure 方法,在measure 中又会调用onMeasure方法,在onMeasure方法中国则会对所有的子元素进行measure 过程,这个时候measure流程就从父容器传递到子元素中了,这样就完成了一次measure 过程,接着子元素会重复父元素的measure 过程,如此反复就完成了整个View 树的遍历,
measure 过程决定了View 的宽和高,Measure完成以后,可以通过getMeasureWidth 、getMeasureHeight 方法来获取到View测量后的宽、高,在几乎所有的情况下他都等同于View最终的宽、高,但是特殊情况下除外
Layout 过程决定了View的四个顶点的坐标和实际的View的宽、高,完成以后可以通过getTop、getButtom、getLeft、getRight 来拿到View的四个顶点的位置,并可以通过getWidth 、getHeight 方法拿到View的最终宽、高
Draw 过程决定了View的显示,只有draw方法完成以后View 的内容才能呈现在屏幕上