Масштабирование изображения в ImageView для сохранения пропорций

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

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

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

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 скорректировал свои границы, чтобы сохранить соотношение сторон его drawable.


никому этого конкретного вопроса. У вас есть 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"

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


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

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


Yo не нужен код java. Вы просто должны :

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

ключ находится в родителе соответствия для width и height


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

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