Pich Blog

关注移动开发,大数据,云计算,软件架构!

12.认识ViewRoot和DecorView

概述

在深入学习View之前还是得先学习小基础才行,这样才能更好理解View的measure,layout,draw过程。

ViewRoot

他的实现类是ViewRootImpl,他是连接WindowManager和DecorView的纽带,同时View的三大流程都是通过ViewRoot来完成的。

在ActivityThread中,当Activity被创建完毕后,会将DecorView添加到Window中,同时还会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。

View的绘制流程

绘制流程都是通过ViewRootImpl来实现了,从performTraversals方法开始的,他会依次调用

performMeasure:调用measure方法,在measure又会调用onMeasure方法,在onMeasure方法中会对所有的子元素进行measure,这时候measure方法调用到子元素的measure方法了,然后子元素重复上述过程就完成了View树的measure。

performLayout:上面一样

performDraw:差不多,唯一不同的performDraw的传递过程是在draw方法中通过dispatchDraw来实现的。

这三个方法分别完成顶级View的measure,layout,draw。

他们的整体流程如下图:

measure有什么用

measure过程决定了View的宽高,measure完成后,就可以通过getMeasuredWidth和getMeasuredHeight方法来获取到View测量后的宽高,几乎所有情况下他都等于View的最终宽高,但有特殊情况。

layout有什么用

layout过程决定了View的四个顶点和实际的View宽高,完成后可以通过getTop,getBottom,getLeft,getRight方法获取到view的顶点,并可以通过getWidth,getHeight方法拿到View的最终宽高。

draw有什么用

这一过程急事绘制了,也就是说前都已经准备好了顶点,宽高那这里就可以按照这些参数将要显示的内容绘制到屏幕上了。只有绘制完成后屏幕上才能看的见。

DecorView

他是顶层View,一般情况下他内部包含一个竖直方向的LinearLayout,这个LinearLayout包含两部分,上面是标题栏,下面是内容容器。我们同setContentView所设置布局就放到了内容容器中。他的id是android.R.id.content。可以通过这样得到content:

从源码看到DecorView就是一个FrameLayout:

view的事件这些都是通过DecorView然后在传给我们的View的。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注