2024年4月1日发(作者:)

Android自定义View之onMeasure()源码分析及重写

系统显示一个View,首先需要通过测量(measure)该View来获得其长和宽从而确定

显示该View时需要多大的空间。而在测量的过程中MeasureSpec贯穿全程,发挥着不

可或缺的作用。 所以,了解View的测量过程,最合适的切入点就是MeasureSpec。

MeasureSpec

我们来看一下Google官方文档对MeasureSpec的描述

A MeasureSpec encapsulates the layout requirements passed from parent to

child. Each MeasureSpec represents a requirement for either the width or the

height. A MeasureSpec is comprised of a size and a mode.

大概意思就是,MeasureSpec封装了从父节点传递给子节点的布局要求。每个

MeasureSpec表示宽度或高度的要求。度量规格包括size(大小)和mode(模式)。

这句话里透漏了几个重点:

MeasureSpec封装了从父节点传递给子节点的布局要求

MeasureSpec可以表示宽度和高度

MeasureSpec由size和mode组成

MeasureSpec通常翻译为”测量规格”,它是一个32位的int数据。其中高2位代表

SpecMode即某种测量模式(mode),低30位为SpecSize代表在该模式下的规格大小

(size)。

可以通过如下方式分别获取这两个值:

获取模式(mode)

int specMode = e(measureSpec);

获取大小(size)

int specSize = e(measureSpec);

还可以通过上面的两个值生成新的MeasureSpec

int measureSpec=asureSpec(size, mode);

那么所谓从父节点传递给子节点的布局要求是什么呢?MeasureSpec里有着三种模

式(mode),我们来看一下:

UNSPECIFIED

The parent has not imposed any constraint on the child. It can be whatever

size it wants.