Android View的绘制流程(一)

        Android 中Activity是作为应用程序的载体存在的,它代表着一个完整的用户界面,提供了一个窗口来绘制各种视图,当Activity启动时,我们会通过setContentView方法来设置一个内容视图,这个内容视图就是用户看到的界面。


Android 的UI管理系统

Android View的绘制流程(一)_第1张图片

       PhoneWindow是Android系统中最基本的窗口系统,每个Activity会创建一个,PhoneWindow是Activity和View系统交互的接口。DecorView本质上是一个Framelayout,是Activity中所有View的祖先。

绘制的整体流程


         当一个应用启动时,会启动一个主Activity,Android系统会根据Activity的布局来对它进行绘制,绘制会从根视图ViewRoot的performTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,而ViewGroup还需要负责通知自己的子View进行绘制操作,视图绘制的过程可以分为三个步骤,分别是测量(Measure) ,布局(Layout)和绘制(Draw)。

Android View的绘制流程(一)_第2张图片
performTraversals()的核心代码

MeasureSpec


        MeasureSpec表示的是一个32位的整型值,它的高2位表示测量模式SpecMode,低30位表示某种测量模式下的规格大学SpecSize,MeasureSpec是View类的一个静态内部类,用来说明应该如何测量这个View,其核心代码如下:

Android View的绘制流程(一)_第3张图片

三种测量模式

UNSPECIFIED:不指定测量模式,父视图没有限制子视图的大小,子视图可以是想要的任何尺寸,通常用于系统内部,应用开发中很少使用到。

EXACTLY:精确测量模式,当该视图的layout_width或者layout_height指定为wrap_content时生效,表示父视图已经决定了子视图的精确大小,这种模式下View的测量值就是SpecSize的值。

AT_MOST:最大值模式,当该视图的layout_width或者layout_height指定为wrap_content时生效,此时子视图的尺寸可以是不超过父视图允许的最大尺寸的任何尺寸。

         对于DecorView而言,它的MeasureSpec由窗口尺寸和其自身的LayoutParams共同决定,对于普通的View,它的MeasureSpec由父视图的MeasureSpec和其自身的LayoutParams共同决定。

Measure


Measure操作用来计算View的实际大小,由前面的分析可知,页面的测量流程是从performMeasure方法开始的,核心代码如下:

Android View的绘制流程(一)_第4张图片

可以看到,具体的测量操作时分发给ViewGroup的,而ViewGroup在它的measureChild方法中传递给子View,代码如下。ViewGroup通过遍历自身所有得子View,并逐个调用子View得measure方法实现测量操作。

Android View的绘制流程(一)_第5张图片
Android View的绘制流程(一)_第6张图片

        下面来看看View(ViewGroup)的measure方法,最终的测量是通过回调onMeasure方法实现的,这个通常由View的特定子类自己实现,开发者也可以通过重写这个方法实现自定义View。

Android View的绘制流程(一)_第7张图片
Android View的绘制流程(一)_第8张图片
Android View的绘制流程(一)_第9张图片

你可能感兴趣的:(Android View的绘制流程(一))