web-dev-qa-db-fra.com

Android ImageView: Ajuster la largeur

Je télécharge une image et la configure comme arrière-plan d'écran de manière dynamique à l'aide de Imageview. J'ai essayé ScaleType, de redimensionner l'image.

Si la hauteur de l'image est supérieure à la largeur, alors ScaleTypesfitStart, fitEnd et fitCenter ne fonctionnent pas. Android réduisez la photo et ajustez-la en fonction de la hauteur, mais je vois un espace vide supplémentaire dans le cadre de la largeur.

Je souhaite réduire la taille de la photo en fonction de la largeur pour l'adapter à la largeur. Peu m'importe s'il y a un espace supplémentaire dans la hauteur ou si la hauteur est trop longue, elle est correcte si elle sort de la vue. (si c'est possible?).

ScaleType.XY redimensionne la photo et ajuste le tout dans le ImageView sans se soucier du rapport hauteur/poids de l'image.

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

J'ai fini par utiliser ce code:

<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"
            />

Assurez-vous de définir l'image en utilisant src au lieu de background.

176
Sharj

Android:adjustViewBounds="true" Fait le travail!

46
ViliusK

Cette solution élégante trouvée ici fonctionnera comme un charme pour vous.

Fondamentalement, il vous suffit de créer une petite classe qui étend ImageView et de simplement remplacer la méthode onMeasure pour ajuster la largeur et la hauteur à votre guise. Ici, il s'adapte à la largeur en utilisant:

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

Vous utiliseriez cette spéciale ImageView comme ceci:

<your.activity.package.AspectRatioImageView 
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_gravity="center_vertical"
    Android:src="@drawable/test" />
12
Michel-F. Portzert

Il existe une méthode simple si vous voulez simplement remplir la largeur de l'écran et avoir une hauteur proportionnelle (et connaître le rapport de l'image), vous pouvez le faire dans 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);

Où 0.6 correspond au réglage du rapport (vous pouvez aussi calculer automatiquement si vous connaissez le poids de l'image).

PS:
Voici le côté 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" />
8
Dan Harvey

Cela fonctionne pour moi.

Créer une classe étend 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);
            }
        }
    }

En XML, utilisez ce qui suit au lieu de ImageView

    <com.yourdomain.utils.ResizableImageView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:src="@drawable/test" />
4
Thomas VJ

Je pense que vous ne pouvez pas le faire uniquement avec XML, vous devez vous redimensionner, le bitmap

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();

        try {
            ((ImageView) findViewById(R.id.background))
                    .setImageBitmap(ShrinkBitmap(width));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

puis

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;

}

Et la mise en page

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