onMeasure(...)正在通过MeasureSpec.EXACTLY,显然是错误的

时间:2012-06-04 21:14:48

标签: android view measurement

我创建了一个实现onMeasure的自定义视图:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    float width = MeasureSpec.getSize(widthMeasureSpec);
    final int widthMode = MeasureSpec.getMode(widthMeasureSpec);

    float height = MeasureSpec.getSize(heightMeasureSpec);
    final int heightMode = MeasureSpec.getMode(heightMeasureSpec);

    float nominalHeight = getResources().getInteger(R.integer.nominalheight);
    float nominalWidth = getResources().getInteger(R.integer.nominalwidth);

    float aspectRatio = nominalWidth / nominalHeight;

    if( width / height > aspectRatio //too wide
            && (
                    widthMode == MeasureSpec.AT_MOST ||
                    widthMode == MeasureSpec.UNSPECIFIED 
            )
            ) { 
        width -= (width - height * aspectRatio);
    }
    if( width / height < aspectRatio //too tall
            && (
                    heightMode == MeasureSpec.AT_MOST ||
                    heightMode == MeasureSpec.UNSPECIFIED 
            )
            ) { 
        height -= (height - width / aspectRatio);
    }

    setMeasuredDimension((int)width, (int)height);
}

在可能的情况下,目的是创建一个长宽比与nominalheightnominalwidth指定的长宽比相同的矩形。显然,如果函数被传递MeasureSpec.EXACTLY,那么它应该以在该方向上给出的维度进行布局。

我将ViewWRAP_CONTENT放在xml的两个方向上。令我困惑的是,通过onMeasure调用,其中一半显示MeasureSpec.AT_MOST,例程计算正确的矩形,另一半显示MeasureSpec.EXACTLY,它显然使用给定的尺寸。更令人费解的是,如果我禁用条件(我会假设,从documentationexample code,不正确),它可以正常工作。

为什么我会使用不同的值来获取这些交替调用,如何说服Android以正确的尺寸显示我的视图?

0 个答案:

没有答案