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.


发布评论