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。

更多相关文章

  1. ANDROID L——Material Design详解(动画篇)
  2. 算法移植优化(一)android 学习笔记
  3. Android之MVC模式
  4. Android回部古剑之ViewFlipper之仙人指路
  5. 浅谈Android中的MVP与动态代理的结合
  6. Android编程开发之在Canvas中利用Path绘制基本图形(圆形,矩形,椭
  7. Android基础控件之基本属性
  8. Android(安卓)自定义View之中国地图热点区域分布
  9. android studio常用窗口简介

随机推荐

  1. Android异步消息处理机制(源码分析+面试题
  2. VisionMobile:Google博士和Android先生
  3. android 横竖屏切换属性和播放视频全屏切
  4. AndroidManifest配置文件介绍
  5. android中的目录结构
  6. android sdk离线升级方法
  7. android:imeOptions属性
  8. [置顶] Android平板、TV中对GridView的优
  9. android 快速入门
  10. Android应用的基本原理