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


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

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

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

21 441

21 ответ:

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

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

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

посмотреть android:adjustViewBounds.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

проблема

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

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

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

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

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

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

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

imageView.setScaleType(ScaleType.FIT_XY);

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

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

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

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

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

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

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

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

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

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

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

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

вам не нужен никакой java-код. Вы просто должны :

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

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

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

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

Pass your imageview and based on screen height and width you can make it  


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

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