深入理解Android View的三大流程,从零自定义View与ViewGroup
2024-01-17 10:40:38
认识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的基础。只有对这三大流程有深入的了解,才能设计出更加灵活和强大的用户界面。