实验观察在 xml 里面给 view 指定高度,最大为 2^23 -1 (再大的话,运行时拿到的高度就是 0 了) 为什么呢,理论上应该是 2^30 -1? 在 Android 10 的模拟器和华为测试都是这个结果
1
unixeno 2021-05-08 19:18:30 +08:00 via Android
溢出了吧
|
2
rosu 2021-05-08 19:24:10 +08:00 via Android
width 和 height 可不就是 int 型嘛...
|
3
rosu 2021-05-08 19:25:02 +08:00 via Android
然后还要转 dp 的呀,XML 读的是 dp 的值。所以要小一些。
|
4
zpxshl OP |
5
rosu 2021-05-09 11:24:45 +08:00 1
@zpxshl 昨天在路上没认真考虑,确实回复的不对。
刚刚看了下源码,发现是 `measureWidth` 大小直接被限制了: ``` public static final int MEASURED_SIZE_MASK = 0x00ffffff; public final int getMeasuredWidth() { return mMeasuredWidth & MEASURED_SIZE_MASK; } ``` https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/view/View.java;drc=95709ba69f9285cceb4515d86eff55793bc96eec;l=16483 虽然 MeasureSpec 是取了 30 位。但是 `onMeasure` 时期已经被限制了大小了。无论怎么取,都只能最多拿到 3 个字节( 2^23) 的最大值。其实如果超过 2^23 也不是都是 0 。如果你试试 (2^ 24 + 1) 就会发现值为 1 。你刚好只测试了 2 的倍数,所以 AND 的低 24 位全为 0 了。 至于为什么是 30 位,这个我就不清楚啦。 |
9
zpxshl OP @rosu 还有个疑惑请教下。。。。0xffffff 低 24 位均是 1,AND 这个值得出的最大值应该也是 0xffffff,2 的 24 次方...,怎么变成 2 的 23 - 1 呢,这里 and 的两个值都是 int 32 位,最高的符号位都是 0 应该不影响结果才是(低 24 位才参与运算)
|
10
rosu 2021-05-09 14:32:26 +08:00 via Android
|
11
rosu 2021-05-09 14:34:00 +08:00 via Android
@rosu 手抖打错:0x00ffffff 高 8 位是零。其他值与之进行 and 运算后只剩下 24 位。
|