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

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

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

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

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

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

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

    См. android:adjustViewBounds .

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

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

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

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

    И установите ширину ImageView для fill_parent и height для 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 . Когда изображение изменяется (при сохранении его соотношения сторон), есть вероятность, что высота или ширина изображения становятся меньше размеров изображения.

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

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

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

      

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

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

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

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

     imageView.setScaleType(ScaleType.FIT_XY); 

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

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

      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.

     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-код. Вам просто нужно:

      

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

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

      

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

    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)); 
    Давайте будем гением компьютера.