Как сделать изображение как можно большим, сохраняя соотношение сторон

У меня есть изображение, которое меньше контейнера, в котором я бы хотел его разместить. Я бы хотел, чтобы изображение растягивалось, сохраняя его соотношение сторон, до его максимально возможного размера.

Чтобы проиллюстрировать эту проблему:

<ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/thumbnail" android:scaleType="fitXY" android:adjustViewBounds="true"/> 

ImageView выше будет растянут, чтобы заполнить ширину контейнера. @drawable также будет растягиваться вдоль оси x, чтобы соответствовать ширине ImageView которая идеально подходит. Однако проблема состоит в том, что размер, обозначенный как wrap_content , в этом случае высота, остается того же размера, что и начальная высота @drawable .

Я прочитал документацию относительно ScaleType здесь и не могу найти ответ там.

Следующее изображение описывает приведенный выше код:

Введите описание изображения здесьВведите описание изображения здесь

  Current behaviour Desired Behaviour 

редактировать

ImageView заданный scaleType="fitCenter" будет точно расширять / сокращать @drawable внутри него, чтобы расти как можно больше, сохраняя его соотношение сторон.

Размеры ImageView s определены до того, как @drawable будет масштабироваться каким-либо образом. Размеры ImageView не производятся путем масштабирования содержащегося в нем @drawable .

Solutions Collecting From Web of "Как сделать изображение как можно большим, сохраняя соотношение сторон"

XML

Единственное решение для этого в XML – это использовать "match_parent" или дискретное максимальное значение вместо "wrap_content" где это возможно. Это гарантирует, что ImageView будет правильным размером, что будет scaleType="fitCenter" добавление scaleType="fitCenter" гарантирует, что @drawable будет правильно масштабироваться.

Programatically

Это уродливо, но вы можете изменить размер ImageView после того, как его размеры получили дискретные значения:

  final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); ViewTreeObserver thumbnailViewVto = thumbnailView.getViewTreeObserver(); thumbnailViewVto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { private boolean changed = false; @Override public void onGlobalLayout() { if(!changed) { Drawable image = getResources().getDrawable(R.drawable.thumbnail); float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); int height = thumbnailView.getHeight(); thumbnailView.setLayoutParams( new LayoutParams( (int) (height * heighToWidthRatio), height)); changed = true; } } }); 

РЕДАКТИРОВАТЬ

  final ImageView thumbnailView = (ImageView) toReturn.findViewById(R.id.thumbnail); thumbnailView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Remove the GlobalOnLayout Listener so it only fires once. thumbnailView.getViewTreeObserver().removeGlobalOnLayoutListener(this) // Find the images Height to Width ratio Drawable image = getResources().getDrawable(R.drawable.thumbnail); float heighToWidthRatio = image.getIntrinsicWidth()/image.getIntrinsicHeight(); // Use this ratio to discover the ratio of the ImageView to allow it to perfectly contain the image. int height = thumbnailView.getHeight(); thumbnailView.setLayoutParams(new LayoutParams( (int) (height * heighToWidthRatio), height)); } }); 

Похоже, вы хотите fitCenter, который использует Matrix.ScaleToFit CENTER .