简单说明
手动调用 View 的 measure(int widthMeasureSpec,int heightMeasureSpec)
方法来得到 View 的宽高。
根据 View 的 LayoutParams 以下几种情况
具体数值(dp/px)
举个栗子,宽高都是 100 px,这时候,有我们来手动拼装合适的 MeasureSpec:
1 | /** |
wrap_content
1 | /** |
这里有点儿小技巧,我将本来应该传入的 widthSize
和 heightSize
改为了 (1<<30)-1
,看过 MeasureSpec 的源码就可以知道,这个特殊的 int 值就是 View 理论上能支持的最大值。
View 的尺寸使用 30 位二进制来表示,也就是说最大是 30 个 1(即 2^30 -1),也就是 (1<<30)-1。
match_parent
上一段 ViewGroup 的源码:
1 | /** |
发现如果要构造在 View 的宽高为 match_parent 时的 MeasureSpec,需要知道 parentSize,而此时因为无法知道 parentSize,所以直接放弃。
NOTE
注意网上的一些奇怪代码,还是举两个常见的栗子:
栗子一
1 | view.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); |
栗子二
1 | int widthMeasureSpec = MeasureSpec.makeMeasureSpec(-1, MeasureSpec.UNSPECIFIED); |
第二个栗子最搞,现在在 Android Studio 里这么写编译器会直接给出错误提示,但是我以前经常能看到这样的代码(不明白原理的时候,我以前也这么做2333)