Растянуть изображение для подгонки

src должен растягивать свою ширину до match_parent , сохраняя соотношение сторон. Когда изображение больше родительского, оно масштабируется правильно. Но когда изображение меньше, оно не масштабируется. (Иллюстрация показывает желаемое поведение).

Введите описание изображения здесь

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitCenter" android:adjustViewBounds="true" android:src="@drawable/foo" /> </RelativeLayout> 

Использование ScaleType.fitXY растягивает только width

Solutions Collecting From Web of "Растянуть изображение для подгонки"

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

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

Как это:

 ImageView imageView = (ImageView)findViewById(R.id.imageView); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.foo); int imageWidth = bitmap.getWidth(); int imageHeight = bitmap.getHeight(); int newWidth = getScreenWidth(); //this method should return the width of device screen. float scaleFactor = (float)newWidth/(float)imageWidth; int newHeight = (int)(imageHeight * scaleFactor); bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); imageView.setImageBitmap(bitmap); 

Кроме того, вам необходимо настроить объявление ImageView в файле макета:

 <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 
 setContentView(R.layout.activity_main); ImageView imageView = (ImageView)findViewById(R.id.imageView); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); int imageWidth = bitmap.getWidth(); int imageHeight = bitmap.getHeight(); DisplayMetrics metrics = this.getResources().getDisplayMetrics(); int newWidth = metrics.widthPixels; float scaleFactor = (float)newWidth/(float)imageWidth; int newHeight = (int)(imageHeight * scaleFactor); bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); imageView.setImageBitmap(bitmap); 

ПЛАНИРОВКА

 <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerInside" android:src="@drawable/image" /> 

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

Обычно я использую следующий класс в XML, когда мне нужно это поведение:

Конечно, я иногда настраиваю его в соответствии с некоторыми требованиями. Но мне легче изменить класс из ImageView в другой класс в XML вместо java-кода в контексте представления.

 package shush.android.util; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.widget.ImageView; /** * @author Sherif elKhatib * * ImageView Class that maintains the width of the view and changes height to keep the aspect ratio. */ public class AspectImageView extends ImageView { public AspectImageView(Context context) { super(context); } public AspectImageView(Context context, AttributeSet attrs) { super(context, attrs); } public AspectImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if(getBackground() == null || getBackground().getIntrinsicHeight()==0 || getBackground().getIntrinsicWidth()==0) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; } int width = MeasureSpec.getSize(widthMeasureSpec); int height = width * getBackground().getIntrinsicHeight() / getBackground().getIntrinsicWidth(); setMeasuredDimension(width, height); } @SuppressLint("NewApi") @SuppressWarnings("deprecation") @Override public void setImageBitmap(Bitmap bm) { if(bm == null) return; BitmapDrawable bd = new BitmapDrawable(getContext().getResources(), bm); if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) setBackground(bd); else setBackgroundDrawable(bd); } } 

Сочетание двух блестящих ответов ( этого и этого ) в быстрое решение. Надеюсь, это спасет кого-то ненужное время исследований!

 private Bitmap getScaledBitmap(int resource) { DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int width = displaymetrics.widthPixels; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resource); float scaleFactor = (float) width / (float) bitmap.getWidth(); int newHeight = (int) (bitmap.getHeight() * scaleFactor); return Bitmap.createScaledBitmap(bitmap, width, newHeight, true); } 

Используйте его так:

 imageView.setImageBitmap(getScaledBitmap(R.drawable.banner_home_2)); 

Используйте этот MainImage.setScaleType(ImageView.ScaleType.FIT_XY);

ИЛИ вы можете просто добавить android:scaleType="fitXY" в xml.

Попробуйте android:scaleType="CENTER_INSIDE"

Android-документы здесь

Имеет:

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/banner" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:adjustViewBounds="true" android:src="@drawable/foo" /> </RelativeLayout> 

Не делать то, что вы хотите?