La src
devrait étendre sa largeur à match_parent
, tout en conservant les proportions. Lorsque l'image est plus grande que le parent, elle est correctement réduite. Mais lorsque l’image est plus petite, elle ne s’agrandit pas. (L'illustration montre le comportement souhaité).
<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>
Utiliser ScaleType.fitXY
étire la width
uniquement
Je pense que ce n'est pas possible, du moins pas avec les options fournies par l'attribut scaleType
.
Dans ce cas, votre meilleure option est d’utiliser centerCrop
, mais seul le centre de la photo sera visible.
Cependant, si cette option ne vous convient pas, vous pouvez redimensionner l’image par programme sans perdre le format de l’image. Pour cela, vous devez calculer un facteur d’échelle basé sur la largeur de l’écran, puis utilisez ce facteur d'échelle pour connaître la nouvelle hauteur de l'image.
Comme ça:
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);
De plus, vous devrez ajuster la déclaration de ImageView
dans le fichier de présentation:
<ImageView
Android:id="@+id/imageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
Android:adjustViewBounds="true"
fait le travail!
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);
DISPOSITION
<ImageView
Android:id="@+id/imageView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:scaleType="centerInside"
Android:src="@drawable/image" />
utiliser cette MainImage.setScaleType(ImageView.ScaleType.FIT_XY);
OU vous pouvez simplement ajouter Android:scaleType="fitXY"
au format xml.
Combinant les deux réponses brillantes ( celle-ci et celle-ci ) en une solution rapide. J'espère que cela économise du temps de recherche inutile à quelqu'un!
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);
}
Utilisez-le comme ceci:
imageView.setImageBitmap(getScaledBitmap(R.drawable.banner_home_2));
J'utilise généralement la classe suivante en XML lorsque je souhaite ce comportement:
Bien sûr, je le tweak parfois selon certaines exigences. Mais je trouve plus facile de changer la classe d'ImageView en une classe différente en XML au lieu du code Java dans le contexte de la vue.
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);
}
}
Essayez Android:scaleType="CENTER_INSIDE"
Est-ce que:
<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>
Ne fais pas ce que tu veux?