Как масштабировать изображение в ImageView, чтобы сохранить соотношение сторон
в Android, я определил ImageView
' s layout_width
на fill_parent
(которая занимает всю ширину телефона).
если изображение я поставил ImageView
больше, чем layout_width
, Android будет масштабировать его, верно? Но как насчет высоты? Когда Android масштабирует изображение, будет ли он сохранять соотношение сторон?
то, что я узнал, что есть пустое пространство в верхней и нижней части ImageView
когда Android масштабирует изображение, которое больше, чем ImageView
. Это правда? Если да, то как я могу устранить это пустое пространство?
21 ответ:
да, по умолчанию Android будет масштабировать изображение вниз, чтобы соответствовать ImageView, сохраняя соотношение сторон. Однако убедитесь, что вы устанавливаете изображение в ImageView с помощью
android:src="..."
, а неandroid:background="..."
.src=
позволяет масштабировать изображение с сохранением соотношения сторон, ноbackground=
делает его шкалы и исказить изображение, чтобы оно точно соответствовало размеру ImageView. (Вы можете использовать фон и источник в то же время, хотя, что может быть полезно для такие вещи, как отображение кадра вокруг основного изображения, используя только один ImageView.)вы также должны увидеть
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 размер.
У меня есть изображение меньше экрана. Чтобы он растягивался пропорционально максимуму и центрировался в представлении, мне пришлось использовать следующий код:
<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 itpublic 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); }