Это действительно очень хороший вопрос.
Вот причина, по которой он так себя ведет (из ImageView.onMeasure (int, int) [строка 661] ):
// Try adjusting height to be proportional to width
if (!done && resizeHeight) {
int newHeight = (int)((widthSize - pleft - pright)
/ desiredAspect) + ptop + pbottom;
if (newHeight <= heightSize) { // line 661
heightSize = newHeight;
} // line 663
}
То, что он делает, это регулирует высоту вида, только если новая высота, основанная на соотношении сторон рисованного объекта и отрегулированной ширине (в нашем случае это точная ширина родительского вида), равна меньше , чем скорректированная высота (которая в данном случае является просто собственной высотой рисования плюс отступ в нашем случае. Дайте мне знать, если вы хотите, чтобы я затормозил эту точку дальше.)
Что я не делаюпочему есть ограничение, что новая высота должна быть меньше.Это имеет смысл, только если наш heightSize либо EXACTLY, либо AT_MOST и для него установлена верхняя граница.В других случаях это не обязательно так.
Так что на самом деле вместо целого фрагмента с 661 по 663 должен был быть еще один вызов
heightSize = resolveAdjustedSize(newHeight, mMaxHeight, heightSpec);
, чтобы убедиться, что мы используем толькоограничение высоты, когда оно должно быть ограничено (т. е. мы получили ограничение AT_MOST в heightSpec, а значение высоты в heightSpec меньше, чем новая высота. Точно не может быть, если мы не используем переменную ширину.)
Может бытьЯ что-то там пропустил.Ребята, кто бы ни читал это, , пожалуйста, прокомментируйте, если вы видите в этом какие-либо недостатки , особенно если вы являетесь частью команды Android в Google:)
PS КакВ качестве обходного пути я могу предложить вам реализовать собственный ImageView и переопределить onMeasure (int, int) , чтобы установить границы для вашего точного соотношения сторон.Дайте мне знать, если вам нужна помощь по фактическому коду.
UPD Я собираюсь написать имена, чтобы привлечь внимание умных ребят из Android в Google (надеюсь, ребятаОповещения Google настроены): Ромен Гай, Роман Нурик, Рето Мейер, пожалуйста, взгляните на это обсуждение.