Масштабирование изображения в 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 скорректировал свои границы, чтобы сохранить соотношение сторон его 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 размер.
У меня изображение меньше экрана. Чтобы он был растянут пропорционально максимальному и центрирован в представлении, мне пришлось использовать следующий код:
<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);
}