返回

View 的测量布局绘制过程剖析

Android

前言

View 是 Android UI 系统的核心组件之一,负责绘制和响应用户交互。为了正确地显示 View,Android 系统需要先测量 View 的大小,然后根据测量结果来布局 View,最后再将 View 绘制到屏幕上。这个过程被称为测量、布局和绘制过程。

测量过程

测量过程是确定 View 大小的过程。Android 系统通过调用 View 的 onMeasure() 方法来完成测量过程。onMeasure() 方法有两个参数:MeasureSpec 和 outputMeasureSpec。MeasureSpec 包含了父 View 对当前 View 的测量限制,outputMeasureSpec 是当前 View 的测量结果。

MeasureSpec 由两部分组成:测量模式和测量值。测量模式有三种:EXACTLY、AT_MOST 和 UNSPECIFIED。EXACTLY 表示父 View 已经确定了当前 View 的大小,当前 View 必须按照父 View 指定的大小进行测量。AT_MOST 表示父 View 对当前 View 的大小有最大限制,当前 View 可以根据自己的需要测量出小于或等于最大限制的大小。UNSPECIFIED 表示父 View 没有对当前 View 的大小进行任何限制,当前 View 可以根据自己的需要测量出任意大小。

测量值是父 View 对当前 View 的大小限制的具体数值。如果测量模式是 EXACTLY,那么测量值就是父 View 指定的大小。如果测量模式是 AT_MOST,那么测量值就是父 View 指定的最大限制。如果测量模式是 UNSPECIFIED,那么测量值是没有意义的。

在 onMeasure() 方法中,View 可以根据自己的需要测量出自己的大小,并将其保存在 outputMeasureSpec 中。如果 View 是一个 ViewGroup,那么它还必须测量其子 View 的大小。ViewGroup 可以通过调用其子 View 的 onMeasure() 方法来完成此操作。

布局过程

布局过程是确定 View 在父 View 中的位置的过程。Android 系统通过调用 View 的 onLayout() 方法来完成布局过程。onLayout() 方法有两个参数:changed 和 l, t, r, b。changed 表示 View 的大小或位置是否发生了改变。l, t, r, b 是 View 在父 View 中的位置。

在 onLayout() 方法中,View 可以根据自己的需要确定自己在父 View 中的位置,并将其保存在 l, t, r, b 中。如果 View 是一个 ViewGroup,那么它还必须布局其子 View。ViewGroup 可以通过调用其子 View 的 onLayout() 方法来完成此操作。

绘制过程

绘制过程是将 View 显示到屏幕上的过程。Android 系统通过调用 View 的 onDraw() 方法来完成绘制过程。onDraw() 方法有一个参数:canvas。canvas 是一个画布对象,View 可以通过 canvas 来绘制自己。

在 onDraw() 方法中,View 可以使用 canvas 来绘制自己的内容。View 可以通过调用 canvas 的各种方法来绘制不同的图形、文本和图片。

总结

测量、布局和绘制过程是 View 显示到屏幕上的基本过程。通过理解这三个过程,我们可以更好地理解 View 的工作原理,并实现自定义 View。