2010-03-26 3 views
412

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

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

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

ответ

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

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

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

+0

Спасибо. Но что, если у меня есть ImageView, и я установил изображение с помощью imageView.setImageBitmap()? – michael

+18

Это то же самое, что и в коде, а не в XML. 'setImageBitmap' такой же, как' android: src = "..." 'и' setBackground ... 'is' android: background = "..." ' –

+0

@SteveHaley Я знаю, что уже слишком поздно, но можете ли вы скажите мне image.setImageDrawable эквивалент в xml-коде – 2013-04-27 07:40:17

7

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

237

См. android:adjustViewBounds.

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

+6

Это правильное решение проблемы. У нас было это на нашем изображении, где высота включала все лишние пробелы. Это не «прозрачные пиксели», так как у нас есть fill_parent для width и wrap_content для высоты. Если у вас нет adjustViewBounds = true, вы получите дополнительные пробелы. Установив это как true, наша проблема исчезла. Благодаря! – christophercotton

+3

спасибо, это и настройка его на src вместо фона отлично работает! – Cameron

+0

См. Также [how-to-scale-bitmap-to-screen-size] (http://stackoverflow.com/questions/6410364/how-to-scale-bitmap-to-screen-size) – ThomasRS

136

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

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

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

и установить ImageView ширину fill_parent и высота до wrap_content.

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

android:adjustViewBounds="true" 
android:layout_centerInParent="true" 
+14

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

+1

Я тоже :(Извините, если мое решение вам не помогло, но это мне помогло. –

+2

Кевин, вы сказали, что именно то, что я искал, – Soham

45

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

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

+1

Почему бы не просто использовать android: scaleType =" centerCrop "? –

+0

работает как шарм, спасибо. scaleType зависит от ситуации, например, мне нужно именно это. – David

+0

Это немного варварский способ изменения размера представления. Что произойдет, если изменения вида изменится после установки растрового изображения в ImageView? Вот почему это должно быть сделано в onMeasure(), которое может быть реализовано, если вы создаете собственный подкласс ImageView. –

2

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

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

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

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

3

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

imageView.setScaleType(ScaleType.FIT_XY); 

где ImageView является представление, представляющее собой ImageView

+4

Нет, это меняет аспектный рацион. Документы говорят: «Масштабирование в X и Y независимо, так что src точно соответствует dst. Это может изменить соотношение сторон src». –

+0

Кстати, этот FIT_XY не может использоваться для изменения ширины/высоты изображения для отображения на изображении. – Bay

7

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

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

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

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

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

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

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

+0

android: layout_weight = "1" - это ключ. – nima

1

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

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

8

Ниже кода Работа по шкале изображения в пропорции:

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

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

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

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

3

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

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

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

Yo не нужно никакого кода Java. Вы просто должны:

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

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

3

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

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

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

android:adjustViewBounds="true" 
android:scaleType="fitXY" 
Смежные вопросы