关于Android视图Measue阶段的问题

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

各位大牛

在阅读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比较合适吗?






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值