在 android.view.View中有个静态内部类MeasureSpec,根据注释,我可以知道它类似一个工具类,用于辅助计算宽高和模式。
有3个常量
MeasureSpec.UNSPECIFIED
表示该view设置的是固定大小,和parent view大小无关,可以很大超过parent view的大小。
MeasureSpec.EXACTLY
表示parent view已经知道大小了,然后该view会采用parent view的大小,不会超过parent view的大小,对应MATCH_PARENT
。
MeasureSpec.AT_MOST
表示自己测量大小,自己该有多大用多大,可以超过parent view 的大小,对应WRAP_CONTENT
。
方法
MeasureSpec.makeMeasureSpec(int size, int mode)
用于创建包含了size和mode的measureSpec值,常用于listview之类的复用view中给child view mesaure。
MeasureSpec.getMode(int measureSpec)
从measureSpec中提取测量mode,只会返回上面3个常量中的某一个。
MeasureSpec.getSize(int measureSpec)
从measureSpec中提取测量后的具体大小值。
MeasureSpec.toString(int measureSpec)
帮助我们调试用的,因为measureSpec 值借助与一些移位运算我们很难直接读懂其中的值,所以这个可以生成measureSpec的size和mode可读信息。
最后介绍几个与测量相关的常用方法
View.resolveSize(int size, int measureSpec)
一般在onMeasure()
最后调用setMeasuredDimension(resolveSize(size,measureSpec),)
, 其实这个返回的和上面makeMeasureSpec()
值一样都可用于setMeasuredDimension()
,