it-swarm.com.ru

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

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

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

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

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

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

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

724
Steve Haley

Смотрите Android:adjustViewBounds .

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

260
Gratzi

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

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

Android:adjustViewBounds="true"
Android:scaleType="centerCrop"

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

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

 Android:adjustViewBounds="true"
 Android:layout_centerInParent="true"
155
Kevin Parker

Если вам нужна переменная 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);

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

50
Kevin

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

Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:maxWidth="39dip"
Android:scaleType="centerCrop"
Android:adjustViewBounds ="true"
11
Mike6679

Ниже приведен код, работающий для масштабирования изображения в качестве пропорции:

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
Mukesh Parmar

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

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
7
shafiq-ur-rehman

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

7
Samuh

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

Android:adjustViewBounds="true"
Android:scaleType="fitXY"

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:adjustViewBounds="true"
    Android:scaleType="fitXY"
    />
5
Atif Mahmood

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

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

4
halxinate

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

imageView.setScaleType(ScaleType.FIT_XY);

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

3
oneConsciousness

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

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

Делая это программно, обязательно вызывайте сеттеры в правильном порядке:

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

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

Android:layout_weight="1"
Android:scaleType="fitCenter"
2
Mohsen Afshin

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

Надеюсь, что это поможет кому-то вниз по дорожке!

1
Parth Kapoor

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

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

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

1
ITisha

Вам не нужен код Java. Вам просто нужно:

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

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

1
Romu Dizzy

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

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

0
Niraj

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

<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" />
0
Flavio Capaccio

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

Android:adjustViewBounds="true"

вместо 

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
0
Sumit Singh

Передайте свой 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);
    }

0
user2100931

в случае использования 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>
0
lvl4fi4