MeasuerSpec 是一个32位的int值,由2种数据组合而成 ——
- 高2位代表 SpecMode
- 低30位代表 SpecSize
SpecMode 只有3个值,代表这个规格的模式
0 —— UNSPECIFIED 未指定
1 —— EXACTLY 精确值
2 —— AT_MOST 最大值
SpecSize 指的是这个规格的大小,单位是像素
一个View需要2个维度的MeasureSpec值,分别是 widthMeasureSpec、heightMeasureSpec,
分别代表着宽度的规格,高度的规格。
这2个维度的MeasureSpec都有一个相同的初始值——Integer.MIN_VALUE —— 0x80000000
具体是什么意思呢?
初始的 MeasureSpace 是 AT_MOST 且长度为 0,但这个初始值没什么卵用,在具体测量的时候就会被覆盖。
onMeasure()方法的2个spec是父容器提供的。表示父容器已经给你计算好一个预估值,用不用就看你了。
如果是直接继承view的话,需要自己重写onMeasure方法,并处理layoutParams.wrap_content的情况。否则就会默认以父容器的大小作为自己的尺寸。
view在测量自己的时候,不需要考虑自己的padding跟margin,父容器会搞定。
网友评论