我创建了一个实现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);
}
在可能的情况下,目的是创建一个长宽比与nominalheight
和nominalwidth
指定的长宽比相同的矩形。显然,如果函数被传递MeasureSpec.EXACTLY
,那么它应该以在该方向上给出的维度进行布局。
我将View
与WRAP_CONTENT
放在xml的两个方向上。令我困惑的是,通过onMeasure调用,其中一半显示MeasureSpec.AT_MOST,例程计算正确的矩形,另一半显示MeasureSpec.EXACTLY,它显然使用给定的尺寸。更令人费解的是,如果我禁用条件(我会假设,从documentation和example code,不正确),它可以正常工作。
为什么我会使用不同的值来获取这些交替调用,如何说服Android以正确的尺寸显示我的视图?