Android ImageView: Fit Width

Я загружаю изображение и динамически устанавливаю его в качестве фона экрана с помощью Imageview . Я попробовал ScaleType , чтобы масштабировать изображение.

Если высота изображения больше ширины, то ScaleTypes fitStart , fitEnd и fitCenter не работают. Android снимет фотографию и поместит ее в зависимости от высоты, но я вижу некоторое дополнительное пустое пространство как часть ширины.

Я хочу масштабировать фотографию по ширине так, чтобы она соответствовала ширине, и мне все равно, есть ли лишнее пустое пространство как часть высоты или высота слишком длинная, это нормально, если она выходит из вида (Если это возможно?).

ScaleType.XY масштабирует фотографию и вписывает все в ImageView и не заботится о соотношении высоты и веса изображения.

 <ImageView android:id="@+id/background" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="fitStart" /> 

Я закончил использование этого кода:

 <ImageView android:id="@+id/background" android:layout_width="match_parent" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/name" /> 

Убедитесь, что вы установили изображение, используя src вместо background .

android:adjustViewBounds="true" выполняет работу!

Это элегантное решение, найденное здесь, будет работать как шарм для вас.

В основном вам просто нужно создать небольшой класс, который расширяет ImageView и просто переопределяет метод onMeasure чтобы настроить ширину и высоту по вашему желанию. Здесь он масштабируется, чтобы соответствовать ширине, используя:

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth(); setMeasuredDimension(width, height); } 

Вы бы использовали этот специальный ImageView следующим образом:

 <your.activity.package.AspectRatioImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_vertical" android:src="@drawable/test" /> 

Существует простой способ, если вы просто хотите заполнить ширину экрана и иметь пропорциональную высоту (и знаете соотношение изображения), вы можете сделать это в OnCreate ():

 setContentView(R.layout.truppview_activity); trupImage = (ImageView) findViewById(R.id.trupImage); Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics outMetrics = new DisplayMetrics(); display.getMetrics(outMetrics); float scWidth = outMetrics.widthPixels; trupImage.getLayoutParams().width = (int) scWidth; trupImage.getLayoutParams().height = (int) (scWidth * 0.6f); 

Где 0.6 – регулировка отношения (вы также можете автоматически вычислять, если знаете w & h изображения).

PS:
Вот XML-сторона:

  <ImageView android:id="@+id/trupImage" android:layout_width="match_parent" android:background="@color/orange" android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="fitCenter" /> 

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

Создание класса extends ImageView

  package com.yourdomain.utils; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; public class ResizableImageView extends ImageView { public ResizableImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Drawable d = getDrawable(); if (d != null) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth()); setMeasuredDimension(width, height); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } 

В xml используйте вместо ImageView

  <com.yourdomain.utils.ResizableImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/test" /> 

Я думаю, вы не можете сделать это только с XML, вам нужно изменить размер, растровое изображение

 Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); try { ((ImageView) findViewById(R.id.background)) .setImageBitmap(ShrinkBitmap(width)); } catch (FileNotFoundException e) { e.printStackTrace(); } 

тогда

 private Bitmap ShrinkBitmap(int width) throws FileNotFoundException { BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); bmpFactoryOptions.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); int widthRatio = (int) android.util.FloatMath .ceil(bmpFactoryOptions.outWidth / (float) width); bmpFactoryOptions.inSampleSize = widthRatio; if (bmpFactoryOptions.inSampleSize <= 0) bmpFactoryOptions.inSampleSize = 0; bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; bmpFactoryOptions.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, bmpFactoryOptions); return bitmap; } 

И макет

  <ImageView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="wrap_content" android:layout_height="wrap_content" />