Android(安卓)View的绘制流程(一)
Android 中Activity是作为应用程序的载体存在的,它代表着一个完整的用户界面,提供了一个窗口来绘制各种视图,当Activity启动时,我们会通过setContentView方法来设置一个内容视图,这个内容视图就是用户看到的界面。
Android 的UI管理系统
PhoneWindow是Android系统中最基本的窗口系统,每个Activity会创建一个,PhoneWindow是Activity和View系统交互的接口。DecorView本质上是一个Framelayout,是Activity中所有View的祖先。
绘制的整体流程
当一个应用启动时,会启动一个主Activity,Android系统会根据Activity的布局来对它进行绘制,绘制会从根视图ViewRoot的performTraversals()方法开始,从上到下遍历整个视图树,每个View控件负责绘制自己,而ViewGroup还需要负责通知自己的子View进行绘制操作,视图绘制的过程可以分为三个步骤,分别是测量(Measure) ,布局(Layout)和绘制(Draw)。
performTraversals()的核心代码MeasureSpec
MeasureSpec表示的是一个32位的整型值,它的高2位表示测量模式SpecMode,低30位表示某种测量模式下的规格大学SpecSize,MeasureSpec是View类的一个静态内部类,用来说明应该如何测量这个View,其核心代码如下:
三种测量模式
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方法开始的,核心代码如下:
可以看到,具体的测量操作时分发给ViewGroup的,而ViewGroup在它的measureChild方法中传递给子View,代码如下。ViewGroup通过遍历自身所有得子View,并逐个调用子View得measure方法实现测量操作。
下面来看看View(ViewGroup)的measure方法,最终的测量是通过回调onMeasure方法实现的,这个通常由View的特定子类自己实现,开发者也可以通过重写这个方法实现自定义View。
更多相关文章
- ANDROID L——Material Design详解(动画篇)
- 算法移植优化(一)android 学习笔记
- Android之MVC模式
- Android回部古剑之ViewFlipper之仙人指路
- 浅谈Android中的MVP与动态代理的结合
- Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭
- Android基础控件之基本属性
- Android(安卓)自定义View之中国地图热点区域分布
- android studio常用窗口简介