返回

安卓View的工作原理(上)

Android

众所周知,安卓为我们提供大量基础控件,用以完成基本功能通常不成问题,功能也非常全面。但对于一些精致的产品而言,仅仅实现基本功能还远远不够,它们往往需要很炫的效果,这就需要自定义view了。不多说,我们直接开始主题,View的绘制分为三步:测量(measure)、布局(layout)、绘制(draw)…

相信安卓开发者们都不陌生View,它是安卓中一切控件的基础,如果一个应用中没有它,那这个应用将无法展现出任何信息,可想而知它在安卓应用中的重要性。
它的内部有着许多关键的组成部分,如:ViewRootImpl、WindowManager、Surface、RenderNode等,还有四大绘制流程:测量(measure)、布局(layout)、绘制(draw)、显示(display)。今天,我们先来看看测量、布局和绘制这三个组成部分。

测量(measure)
在View的测量阶段,系统需要确定每个View的宽和高,也就是View所占据的空间。这个过程主要分为两步:

  1. 测量View的子View
    这个过程由父View来完成,父View会遍历它的所有子View,并调用子View的measure()方法来测量子View的宽和高。

  2. 测量自身
    在测量了所有子View的宽和高后,父View需要测量自身的宽和高。这个过程也是通过调用父View自己的measure()方法来完成的。

在测量View时,系统会考虑以下因素:

  • View的布局参数(LayoutParams)
  • 父View的可用空间(available space)
  • View的最小宽和高(minWidth和minHeight)

测量View的目的是为了确定View的最终宽和高。这个信息将在布局阶段被用来确定View的位置。

布局(layout)
在View的布局阶段,系统会将View放置在屏幕上的正确位置。这个过程主要分为两步:

  1. 布局View的子View
    这个过程由父View来完成,父View会遍历它的所有子View,并调用子View的layout()方法来布局子View。

  2. 布局自身
    在布局了所有子View后,父View需要布局自身。这个过程也是通过调用父View自己的layout()方法来完成的。

在布局View时,系统会考虑以下因素:

  • View的布局参数(LayoutParams)
  • 父View的可用空间(available space)
  • View的测量结果(measure结果)

布局View的目的是为了确定View在屏幕上的最终位置。这个信息将在绘制阶段被用来绘制View。

绘制(draw)
在View的绘制阶段,系统会将View的内容绘制到屏幕上。这个过程主要分为两步:

  1. 绘制View的子View
    这个过程由父View来完成,父View会遍历它的所有子View,并调用子View的draw()方法来绘制子View。

  2. 绘制自身
    在绘制了所有子View后,父View需要绘制自身。这个过程也是通过调用父View自己的draw()方法来完成的。

在绘制View时,系统会考虑以下因素:

  • View的绘制参数(DrawParams)
  • View的测量结果(measure结果)
  • View的布局结果(layout结果)

绘制View的目的是为了将View的内容显示到屏幕上。这个过程通常由GPU来完成。

总结
以上就是View的测量、布局和绘制这三个组成部分。这三个过程是环环相扣的,缺一不可。只有正确地测量和布局View,才能正确地绘制View。

以上即是关于View这三个组成部分的介绍,更多详细信息请参考官方文档。

以下是一些额外的参考资料: