返回

深入理解Android View的三大流程,从零自定义View与ViewGroup

Android

认识View的三大流程

在Android中,View是构建用户界面的基本单位。View的工作流程主要分为三大步骤:

  • measure :测量View的宽高,确定View的最终大小。
  • layout :根据View的测量结果,确定View在父容器中的位置。
  • draw :绘制View,将其内容呈现给用户。

这三大流程是View工作的前提,也是自定义View和ViewGroup的基础。只有对这三大流程有深入的了解,才能设计出更加灵活和强大的用户界面。

measure流程

measure流程是View工作的第一步,也是最重要的一步。在measure流程中,View会根据自身的属性和父容器的测量结果,计算出自己的最终大小。

measure流程分为两个阶段:

  • measureAtMost阶段 :在这个阶段,View会根据父容器给定的最大宽度和高度,计算出自己的最大宽度和高度。
  • measureExactly阶段 :在这个阶段,View会根据父容器给定的精确宽度和高度,计算出自己的精确宽度和高度。

View的测量结果会保存在View的measuredWidth和measuredHeight属性中。

layout流程

layout流程是View工作的第二步。在layout流程中,View会根据自己的测量结果,确定自己在父容器中的位置。

layout流程分为两个阶段:

  • layout阶段 :在这个阶段,View会根据父容器的布局方式,计算出自己的位置。
  • offsetChildren阶段 :在这个阶段,View会将自己的子View定位到正确的位置。

View的位置会保存在View的left、top、right和bottom属性中。

draw流程

draw流程是View工作的最后一步。在draw流程中,View会将自己的内容绘制到屏幕上。

draw流程分为两个阶段:

  • preDraw阶段 :在这个阶段,View会进行一些准备工作,比如计算滚动条的位置。
  • draw阶段 :在这个阶段,View会将自己的内容绘制到屏幕上。

View的内容会保存在View的canvas属性中。

MeasureSpec

MeasureSpec是一个整数,它包含了父容器对子View的测量要求。MeasureSpec由两个部分组成:

  • 测量模式 :测量模式指定了父容器对子View的测量要求。测量模式有三种:UNSPECIFIED、EXACTLY和AT_MOST。
  • 测量值 :测量值指定了父容器对子View的测量要求的具体数值。

MeasureSpec的格式如下:

MeasureSpec.makeMeasureSpec(测量值, 测量模式)

例如,以下代码指定了父容器对子View的测量要求是宽度为100dp,高度为WRAP_CONTENT:

MeasureSpec.makeMeasureSpec(100, MeasureSpec.EXACTLY)

自定义View

自定义View是指创建一个继承自View类的类。自定义View可以让我们创建出具有特定功能和外观的View。

要自定义View,我们需要重写以下几个方法:

  • onMeasure :这个方法在measure流程中被调用,用于计算View的测量结果。
  • onLayout :这个方法在layout流程中被调用,用于确定View在父容器中的位置。
  • onDraw :这个方法在draw流程中被调用,用于绘制View的内容。

自定义ViewGroup

自定义ViewGroup是指创建一个继承自ViewGroup类的类。自定义ViewGroup可以让我们创建出具有特定布局方式的容器。

要自定义ViewGroup,我们需要重写以下几个方法:

  • onMeasure :这个方法在measure流程中被调用,用于计算ViewGroup的测量结果。
  • onLayout :这个方法在layout流程中被调用,用于确定ViewGroup的子View的位置。
  • onDraw :这个方法在draw流程中被调用,用于绘制ViewGroup的内容。

结语

Android View的三大流程——measure、layout和draw,以及MeasureSpec,是自定义View和ViewGroup的基础。只有对这三大流程有深入的了解,才能设计出更加灵活和强大的用户界面。