Как масштабировать изображение в 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); }