Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон

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

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

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

Ответ 1

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

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

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

Ответ 2

См. android:adjustViewBounds.

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

Ответ 3

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

Добавьте эти два атрибута в свой ImageView:

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

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

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

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"

Ответ 4

Если вы хотите, чтобы 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);

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

Ответ 5

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

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"

Ответ 6

Ниже кода Работа с масштабным изображением как соотношение сторон:

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);

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />

Ответ 10

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

<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, они скорее всего будут перекрываться изображением.

Ответ 11

Для любого из вас, кто хочет, чтобы изображение соответствовало точности изображения с правильным масштабированием и без использования обрезки, используйте

imageView.setScaleType(ScaleType.FIT_XY);

где imageView - это представление, представляющее ваш ImageView

Ответ 12

Вы можете рассчитать ширину экрана. И вы можете масштабировать растровое изображение.

 public static float getScreenWidth(Activity activity) {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        float pxWidth = outMetrics.widthPixels;
        return pxWidth;
    }

рассчитать ширину экрана и масштабированную высоту изображения по ширине экрана.

float screenWidth=getScreenWidth(act)
  float newHeight = screenWidth;
  if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
     newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
  }

После масштабирования растрового изображения.

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);

Ответ 13

При этом программно не забудьте позвонить сеттерам в правильном порядке:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)

Ответ 14

Если качество изображения падает: используйте

android:adjustViewBounds="true"

вместо

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

Ответ 15

Если вы хотите, чтобы ваше изображение занимало максимально возможное пространство, лучшим вариантом было бы

android:layout_weight="1"
android:scaleType="fitCenter"

Ответ 16

Попробуйте использовать android:layout_gravity для ImageView:

android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"

Приведенный выше пример работал у меня.

Ответ 17

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

Надеюсь, это поможет кому-то по переулку!

Ответ 18

Мне не нужен какой-либо Java-код. Вам просто нужно:

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />

Ключ в родительском матке для ширины и высоты

Ответ 19

Я использую это:

<ImageView
android:id="@+id/logo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:scaleType="centerInside"
android:src="@drawable/logo" />

Ответ 20

Передайте свой ImageView и на основе высоты и ширины экрана вы можете сделать его

    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }

Ответ 21

в случае использования cardview для округления imageview и исправленного android:layout_height для заголовка это сработало для меня, чтобы загрузить изображение с Glide

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="220dp"
             xmlns:card_view="http://schemas.android.com/apk/res-auto"
             >

    <android.support.v7.widget.CardView
            android:id="@+id/card_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center|top"
            card_view:cardBackgroundColor="@color/colorPrimary"
            card_view:cardCornerRadius="10dp"
            card_view:cardElevation="10dp"
            card_view:cardPreventCornerOverlap="false"
            card_view:cardUseCompatPadding="true">

        <ImageView
                android:adjustViewBounds="true"
                android:maxHeight="220dp"
                android:id="@+id/iv_full"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scaleType="fitCenter"/>

    </android.support.v7.widget.CardView>
</FrameLayout>

Ответ 22

Вы можете масштабировать изображение, которое также уменьшит размер вашего изображения. Для этого есть библиотека, которую вы можете скачать и использовать. https://github.com/niraj124124/Images-Files-scale-and-compress.git

Как использовать 1) Импортировать компрессор-v1.0. баночка для вашего проекта. 2) Добавьте приведенный ниже пример кода для тестирования. ResizeLimiter resize = ImageResizer.build(); resize.scale("inputImagePath", "outputImagePath", imageWidth, imageHeight); По вашему требованию есть еще много методов

Ответ 23

Вот как это работает для меня в ConstraintLayout:

<ImageView
    android:id="@+id/myImg"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true"/>

Ответ 24

myImageView.setAdjustViewBounds(true);

Ответ 25

imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));