У меня есть пользовательское представление (отображение с точечной матрицей), и я хочу занять максимальную доступную ширину его родительского элемента.
Но высота этого пользовательского представления должна быть рассчитана (в зависимости от его ширины) чтобы соблюдать некоторые параметры формы, нужно использовать соотношение сторон.
Если эта вычисленная высота превышает максимальную высоту его родителя, то ширина пользовательского представления должна быть соответственно уменьшена. Я сделал это с помощью двоичного поиска:
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 widthMeasureSpe c, int heightMeasureSpe c) и onSizeChanged (int w, int h, int oldw, int oldh) :
BiDimensions - это простой класс, содержащий поле ширины и высоты
setupDimensions - это процедура, вызываемая для вычисления внутренних размеров и заполнения некоторых полей простого класса (sizesSetTemp), включая высоту, необходимую для соблюдения соотношения сторон, в зависимости от доступной ширины ( x)
Интервал поиска от xMin до xTop, проверка средней точки и вычисление следующего интервала
Последний хороший кандидат xCand (ширина) и yCand (соответствующая высота), которые относятся к hMax (максимальная высота)
Есть ли лучший способ сделать это?
Спасибо