Android学习笔记(五)| View的工作原理(上)

2019-01-10  本文已影响0人  CCCode1997

参考书籍:《Android开发艺术探索》 任玉刚
如有错漏,请批评指出!

View的工作原理其实主要就是关于View绘制的三大流程——measure、layout和draw过程,在了解这三大流程之前,我们还需要了解一些基本概念,作为铺垫。

ViewRoot 和 DecorView

ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联,这个过程可参看源码:

关于Android控件架构的内容前面讲过 Android 控件架构与自定义控件,这里不再赘述。
View的绘制流程是从ViewRoot的 performTraversals 方法开始的,它经过 measure、layout、draw三个过程才能最终将一个View绘制出来。其中 measure 用来测量View的宽高,layout 用来确定View在父容器中的放置位置,而 draw 则负责将 View 绘制在屏幕上。具体可看下图:

从图中可以看到,整个页面的绘制是层层进行的,performMeasure 方法会调用 measure 方法,measure 方法中会调用 onMeasure 方法,在 onMeasure 方法中会对所有的子View进行 measure 过程,这个时候 measure 流程就从父容器传递到子元素中了,接着子 View会重复 和父容器相同的 measure 过程,这样反复之后就完成了整个 View 树的遍历。performLayout 和 performDraw 的传递流程也是如此,唯一不同的就是 performDraw 的传递过程是在 draw 方法中调用 dispatchDraw 方法从而对子View进行绘制。

  1. measure 过程决定了View的宽高,measure完成以后,可以通过 getMeasureWidth 和 getMeasureHeight 方法来获取到View测量后的宽 / 高,在大多情况下,它都等于View最终的宽 / 高(存在特殊情况)。
  2. layout 过程决定了View 的四个顶点坐标和实际的View宽高,完成之后,可以通过 getTop、getButtom、getLeft 和 getRight来拿到四个位置参数,并可以通过getWidth 和 getHeight方法拿到View的最终宽高。
  3. draw过程决定了View的显示,只有draw方法完成后,View的内容才能呈现在屏幕上。

关于 MeasureSpec

为了更好地理解 View 的测量过程,首先得理解 MeasureSpec 是个什么概念,从字面看,就是“测量规格”,在前面的博客中也简单的介绍过 MeasureSpec 是什么,下面从源码的角度具体进行分析。


上一篇:Android学习笔记(四)| Android 控件架构与自定义控件
下一篇:Android学习笔记(六)| View的工作原理(下)

上一篇 下一篇

猜你喜欢

热点阅读