各位大牛
在阅读Android视图measure相关源码时小弟有一处不解,抛出来请各位给分析分析
我们都知道MeasureSpec封装了测量过程中父视图对子视图的要求,即它的0-30位表示size,31-32位表示模式。
那么问题来了,看下面的代码
View.java代码
public static final int MEASURED_STATE_TOO_SMALL = 0x01000000;
public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
int result = size;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
switch (specMode) {
case MeasureSpec.UNSPECIFIED:
result = size;
break;
case MeasureSpec.AT_MOST:
if (specSize < size) {
result = specSize | MEASURED_STATE_TOO_SMALL;
} else {
result = size;
}
break;
case MeasureSpec.EXACTLY:
result = specSize;
break;
}
return result | (childMeasuredState&MEASURED_STATE_MASK);
}
MeasureSpec类代码
private static final int MODE_SHIFT = 30;
private static final int MODE_MASK = 0x3 << MODE_SHIFT;
public static int getSize(int measureSpec) {
return (measureSpec & ~MODE_MASK);
}resolveSizeAndState方法用于在测量阶段根据自身要求的size和父视图的限制生成合适的size。当子视图不满意父视图给的约束时,可以通过置MEASURED_STATE_TOO_SMALL位来反馈。可是MEASURED_STATE_TOO_SMALL定义为0x01000000,即32位二进制00000001000000000000000000000000,MeasureSpec中getSize返回的结果是与00111111111111111111111111111111位与的结果,即getSize取的是0-30位作为size,而resolveSizeAndState中却将getSize的结果与MEASURED_STATE_TOO_SMALL位或,那不是影响到size的值了吗?
说白了我的问题就是为什么MEASURED_STATE_TOO_SMALL和MODE_MASK过滤的位数是不一样的,MEASURED_STATE_TOO_SMALL不应该定义为0x1<<30比较合适吗?

在阅读Android视图的测量源码时,作者对MeasureSpec的使用产生疑问。MeasureSpec用于封装父视图对子视图的测量要求,其30位及以下表示大小,31-32位表示模式。问题在于MEASURED_STATE_TOO_SMALL和MODE_MASK的位过滤不同,作者疑惑为何不将MEASURED_STATE_TOO_SMALL定义为0x1<<30。
2415

被折叠的 条评论
为什么被折叠?



