我有一个自定义视图(点矩阵显示),我想占据其父级的最大可用宽度。
但是为了尊重某些表单参数(一种纵横比),必须计算此自定义视图的高度(取决于其宽度)。
如果此计算的高度超过其父代的最大高度,则必须相应减小自定义视图的宽度。 我是通过二进制搜索做到的:
private BiDimensions getMaxDimensions(int proposedWidth, int proposedHeight) {
int xTop = proposedWidth;
int hMax = proposedHeight;
int xMin = 0;
int xCand = 0;
int yCand = 0;
int oldX = 0;
int x = xTop;
do {
setupDimensions(dimensionsSetTemp, x);
int y = dimensionsSetTemp.height;
if (y <= hMax) {
xCand = x; // On a un nouveau candidat !
yCand = y;
if ((x == xTop) || (y == hMax)) { // Parfait !
break;
}
xMin = x; // Examiner maintenant l'intervalle [x,xTop]
} else { // y > hMax
xTop = x; // Examiner maintenant l'intervalle [xMin,x]
}
oldX = x;
x = (xMin + xTop) / 2;
} while (x != oldX); // Si x=oldX, on ne progresse plus => Accepter le dernier candidat
maxDimensions.width = xCand;
maxDimensions.height = yCand;
return maxDimensions;
}
在上述代码中,在 onMeasure(int widthMeasureSpec,int heightMeasureSpec)和 onSizeChanged(int w,int h,int oldw,int oldh)期间调用:
BiDimensions 是包含宽度和高度字段的简单类
setupDimensions 是一个用于计算内部尺寸并填充简单类(dimensionsSetTemp)的某些字段的过程,其中包括尊重其长宽比所需的高度,具体取决于可用宽度( x)
查找间隔是从xMin到xTop,检查中点并计算下一个间隔
最后一个合适的候选对象是xCand(宽度)和yCand(对应的高度),它们都尊重hMax(最大高度)
有更好的方法吗?
谢谢