web-dev-qa-db-fra.com

Étirer l'image pour s'adapter

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é).

enter image description here

<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

15
Matt

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" />
22
Andy Res

Android:adjustViewBounds="true" fait le travail!

5
ViliusK
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" />
5
Pedro Lobito

utiliser cette MainImage.setScaleType(ImageView.ScaleType.FIT_XY);

OU vous pouvez simplement ajouter Android:scaleType="fitXY" au format xml.

3
halo89

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));
2
Oleksiy

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);
    }
}
2
Sherif elKhatib

Essayez Android:scaleType="CENTER_INSIDE"

Documents Android ici

1
Dan Schnau

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?

0
yarian