当一个Activity呈现在用户面前时,其布局将被绘制出来。android系统将处理绘制的过程,但是,前提是Activity需要提供其布局的根节点。

绘制过程从布局的根节点开始,然后对整个布局树型结构(layout tree)进行测量并绘制,绘制过程沿着布局树型结构(layout tree)进行,依次渲染其中的各个View。在这个遍历过程中,遇到ViewGroup时,每个ViewGroup(注意,ViewGroup也属于 View的一种)将依次绘制包含于其中的View;遇到View时,View将绘制自身。由于绘制的过程是沿着布局树型结构(layout tree)遍历的,所以,布局树型结构(layout tree)中的父节点将先于孩子结点被绘制,而兄弟结点则按照它们出现的顺序进行绘制。

绘制布局需要经过两个pass process(传递过程?),分别是measure pass和layout pass(可以翻译为测量的传递过程,计算布局的传递过程?)。measure pass是在方法measure(int,int) 中进行的,measure pass自上而下地递归遍历布局结构。在递归过程中,每个View都沿着布局树传递dimension specifications,在measure pass结束时,每个View都将获得自身的测量结果。第二个pass process是layout pass,这个过程在在layout(int,int,int,int) 中进行,并且和measure pass一样是自上而下的(top-down),在layout pass过程中,每个父结点都将利用measure pass的测量结果,计算出各个子结点的位置。

当一个View对象的measure()方法执行完之后,该View以及其子结点的getMeasureWidth()和 getMeasureHeight()的返回值必须已经被赋值,(其实这两个方法分别返回View对象中的变量mMeasureWidth和 mMeasureHeigth,这两个变量的注释是:Height/Width as measured during measure pass)。各个View的测量宽度和测量高度必须遵从其父结点传递过来的限制条件(其实就是上文提到的dimension specifications)。这样才能保证在measure pass结束时,每个父节点能接受其各个子结点的测量结果。一个parent View可能不止触发其子结点的measure()方法依次,比如,父结点可能第一次首先测量每个没指定大小的子结点,测量出它们需要占用多大的空间,而 如果经过第一轮测量,各个子结点的计算结果相互之间有所冲突,则父结点将再次调用各个子结点的onMeasure()方法测量各个子结点。

measure pass使用两个类去传递关于测量大小的值。这两个类分别是ViewGroup.LayoutParams和MeasureSpec。View对象可以借 助ViewGroup.LayoutParams对象去告诉它的父结点,它需要怎样的大小和放置在什么位置。最基础的 ViewGroup.LayoutParams类只能描述View的高和宽。它可以指定的高和宽有以下三类

  • 某个确切的数值
  • MATH_PARENT,代表该View希望和它的父结点一样大(减去padding)
  • WRAP_CONTENT,代表该View希望大小足够包围住它的内容(加上padding)

ViewGroup.LayoutParams有几个子类,它们分别为ViewGroup几个对应的子类而存在。比 如,RelativeLayout有自己的一个ViewGroup.LayoutParams的子类,它有一个特殊的功能,可以讲子结点设置在水平方向上 的中点,或者垂直方向上的中点。

MeasureSpec对象是由父结点传递给子节点的一个对象,父结点对子结点的限制信息保存在该对象中。MeasureSpec对象可以有以下三种模式:

  • UNSPECIFIED:父结点对子结点的大小没有任何要求。
  • EXACTLY:  父结点要求其子节点的大小指定为某个确切的值。其子节点以及其他子孙结点都需要适应该大小。
  • AT MOST:父结点要求其子节点的大小不能超过某个最大值,其子节点以及其他子孙结点的大小都需要小于这个值

该文章中还提到两个小tips:

  • invalidate():调用该方法,可以强制重新绘制界面
  • requestLayout():当前布局大小改变时,可以调用该方法,刷新布局。

转载于:https://www.cnblogs.com/6060b/p/4251766.html

Android界面绘制流程--------How Android Draws Views相关推荐

  1. Android UI绘制流程分析(三)measure

    源码版本Android 6.0 请参阅:http://androidxref.com/6.0.1_r10 本文目的是分析从Activity启动到走完绘制流程并显示在界面上的过程,在源码展示阶段为了使跟 ...

  2. Android视图绘制流程完全解析,带你一步步深入了解

    Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了解View(二) Android视图状态及重绘流程分析,带你 ...

  3. Android View 绘制流程

    前面讲到 Android View 加载流程,使用 LayoutInflater 将 xml 文件转变成 View ,但是还需要将 View 绘制出来,才能被用户看到,这一过程为绘制流程.由于 And ...

  4. Android视图绘制流程完全解析,带你一步步深入了解View(二)

    在上一篇文章中,我带着大家一起剖析了一下LayoutInflater的工作原理,可以算是对View进行深入了解的第一步吧.那么本篇文章中,我们将继续对View进行深入探究,看一看它的绘制流程到底是什么 ...

  5. android 绘图流程,Android View绘制流程

    前言 不知道大家有没有想过一个问题,当启动一个Activity的时候,相应的XML布局文件中的View是如何显示到屏幕上的?有些同学会说是通过onMeasure().onLayout().onDraw ...

  6. Android视图绘制流程完全解析(二)

    转载:http://blog.csdn.net/guolin_blog/article/details/16330267 https://segmentfault.com/a/119000000462 ...

  7. Android界面生成流程:WindowManager和Window的关系

    WindowManager和Window添加View的区别 WindowManager中有个添加View的函数: public void addView(View view, ViewGroup.La ...

  8. Android RecyclerView 绘制流程及Recycler缓存

    前言 RecyclerView源码一万多行,想全部读懂学会挺麻烦的,感兴趣的可以自己去瞅瞅,这篇文章重点来看下 RecyclerView是如何一步步将每一个 ItemView 显示到屏幕上,然后再分析 ...

  9. Android RecyclerView 绘制流程及Recycler缓存,Android开发者必看避坑指南

    - mState.mIsMeasuring = false; if (mState.mLayoutStep == State.STEP_START) { dispatchLayoutStep1(); ...

  10. android 界面绘制完毕,几种获取android 界面性能数据的快捷方法

    探测 界面绘制性能 获取界面的绘制性能有很多种方法,比如说 Systrace 但是这种方法 有一个不太好的地方就是使用起来较为复杂, 有没有一种 谷歌官方推荐 的方便一点的方法 ,其实是有的,只需要一 ...

最新文章

  1. linux 程序 加密码忘了怎么办,linux忘记了密码怎么办
  2. 计算机的颜色储存格式(索引色 真彩色)
  3. functools.partial()==>预先设置参数,使得之后调用的时候,减少函数的参数
  4. Jquery Ajax +.ashx XML数据格式
  5. Linux设备模型:kset, kobj, ktype
  6. java中KMP模式,Java数据结构-串及其应用-KMP模式匹配算法
  7. webpack 加载html模板,Webpack:从html模板加载图像
  8. 2019年12月7日pmp考试成都在哪考
  9. VS2019 + QT5.12调试时无法显示Qt相关变量如QString具体值
  10. ATO(韩商爱拓)1Gbit SPI NAND Flash领先全球
  11. opencv附加依赖项
  12. 在电脑上使用考研APP的方法(亲测有效)
  13. 2021年如何折腾小米平板2,装上win11
  14. 恢复IDEA中误删的文件
  15. php空间xpyun_PHP云(phpyun)人才招聘系统V3.1_beta最新企业版带微信客户端+PC客户端+手机客户端...
  16. winform访问被拒绝_c#串口提示端口访问被拒绝
  17. Flutter 弹幕组件hi_barrage封装
  18. 2021年YCC发展路线图
  19. flash和RAM的关系
  20. 怎么最快地复制一张表?

热门文章

  1. apache源码安装过程
  2. jquery插件 validation表单的验证的应用的一个例子
  3. Android 原生开发、H5、React-Native Flutter 使用利弊和场景技术分享
  4. 任意文件夹下打开cmd窗口
  5. 假如你是架构师,你要做些什么
  6. HTTP中GET与POST的区别,99 %的人都理解错了
  7. 这就是为什么IT人没有女朋友的原因!!
  8. 哎呦,我他妈真操了!
  9. c语言指针 r,C语言指针的高级操作
  10. python calu()函数_酚酞指示剂是一类什么物质,它在PH=10时是什么颜色呢(     )...