Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон - PullRequest
480 голосов
/ 26 марта 2010

В Android я определил ImageView layout_width как fill_parent (что занимает всю ширину телефона).

Если изображение, которое я поместил в ImageView, больше, чем layout_width, Android будет масштабировать его, верно? Но как насчет высоты? Когда Android масштабирует изображение, оно сохранит соотношение сторон?

Что я обнаружил, так это то, что в верхней и нижней части ImageView есть пробелы, когда Android масштабирует изображение, которое больше ImageView. Это правда? Если да, как я могу устранить этот пробел?

Ответы [ 25 ]

750 голосов
/ 26 марта 2010
  1. Да, по умолчанию Android уменьшит изображение до размера ImageView, сохранив соотношение сторон. Однако убедитесь, что вы устанавливаете изображение в ImageView, используя android:src="..." вместо android:background="...". src= позволяет масштабировать изображение с сохранением соотношения сторон, но background= делает его масштабированным , а искажает изображение, чтобы оно точно соответствовало размеру ImageView. (Вы можете использовать фон и источник одновременно, что может быть полезно для таких вещей, как отображение рамки вокруг основного изображения, используя только один ImageView.)

  2. Вы также должны увидеть android:adjustViewBounds, чтобы заставить ImageView изменить размер, чтобы соответствовать масштабированному изображению. Например, если у вас есть прямоугольное изображение в том, что обычно было бы квадратным ImageView, AdjustViewBounds = true заставит его изменить размеры ImageView, чтобы быть также прямоугольным. Затем это влияет на расположение других видов вокруг ImageView.

    Затем, как писал Самух, вы можете изменить способ масштабирования изображений по умолчанию, используя параметр android:scaleType. Кстати, самый простой способ узнать, как это работает, было бы просто немного поэкспериментировать! Просто не забудьте взглянуть на макеты в самом эмуляторе (или на реальном телефоне), так как предварительный просмотр в Eclipse обычно неверен.

270 голосов
/ 08 июля 2010

См. android:adjustViewBounds.

Установите для этого параметра значение true, если вы хотите, чтобы ImageView корректировал свои границы, чтобы сохранить соотношение сторон его отрисовки.

161 голосов
/ 26 мая 2011

Для всех, кто имеет эту конкретную проблему. У вас есть ImageView (или другой View), который вы хотите иметь ширину fill_parent и пропорционально масштабированную высоту:

Добавьте эти два атрибута к вашему ImageView:

android:adjustViewBounds="true"
android:scaleType="centerCrop"

И установите ImageView ширину fill_parent и высоту wrap_content.

Кроме того, если вы не хотите, чтобы изображение было обрезано, попробуйте следующее:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"
53 голосов
/ 18 марта 2012

Если вы хотите ImageView, который одновременно масштабируется и увеличивается при сохранении правильного соотношения сторон, добавьте его в ваш XML:

android:adjustViewBounds="true"
android:scaleType="fitCenter"

Добавьте это к своему коду:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

Мне потребовалось некоторое время, чтобы заставить это работать, но это, кажется, работает в случаях, когда изображение меньше ширины экрана и больше ширины экрана, и оно не упаковывает изображение.

12 голосов
/ 28 марта 2013

Это сработало для меня:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"
8 голосов
/ 12 сентября 2014

Код ниже Работа с масштабным изображением в формате:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);
8 голосов
/ 24 апреля 2017

это решило мою проблему

android:adjustViewBounds="true"
android:scaleType="fitXY"
7 голосов
/ 26 марта 2010

Взгляните на ImageView.ScaleType , чтобы контролировать и понимать, как происходит изменение размера в ImageView. При изменении размера изображения (при сохранении его соотношения сторон) есть вероятность, что высота или ширина изображения станет меньше размеров ImageView.

5 голосов
/ 05 мая 2016

Используйте эти свойства в ImageView, чтобы сохранить соотношение сторон:

android:adjustViewBounds="true"
android:scaleType="fitXY"

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />
4 голосов
/ 02 октября 2012

У меня изображение меньше экрана. Чтобы он растягивался пропорционально максимуму и центрировался в виде, я должен был использовать следующий код:

<ImageView
    android:id="@+id/my_image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:adjustViewBounds="true"
    android:layout_weight="1"
    android:scaleType="fitCenter" />

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

...