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

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

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

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

Ответы [ 25 ]

3 голосов
/ 10 декабря 2012

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

imageView.setScaleType(ScaleType.FIT_XY);

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

3 голосов
/ 20 декабря 2018

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

android:adjustViewBounds="true"

вместо

android:adjustViewBounds="true"
android:scaleType="fitXY"
3 голосов
/ 06 апреля 2017

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

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
3 голосов
/ 10 марта 2015

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

 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);
2 голосов
/ 19 августа 2012

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

android:layout_weight="1"
android:scaleType="fitCenter"
1 голос
/ 20 августа 2013

Попробуйте использовать 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 голос
/ 17 января 2017

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

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

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

1 голос
/ 08 апреля 2014

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

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

0 голосов
/ 07 ноября 2018

в случае использования 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 голосов
/ 26 июня 2013

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

<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" />
...