web-dev-qa-db-fra.com

Comment redimensionner une image dans ImageView pour conserver les proportions

Dans Android, j'ai défini un layout_width de ImageView comme étant fill_parent (qui occupe toute la largeur du téléphone).

Si l'image que j'ai mise à ImageView est plus grande que le layout_width, Android la redimensionnera, n'est-ce pas? Mais qu'en est-il de la hauteur? Lorsque Android redimensionne l'image, conservera-t-il le rapport d'aspect?

Ce que j’apprends, c’est qu’il ya des espaces en haut et en bas de la ImageView lorsque Android redimensionne une image plus grande que la ImageView. Est-ce vrai? Si oui, comment puis-je éliminer cet espace blanc?

461
michael
  1. Oui, par défaut, Android réduira votre image pour l'adapter à ImageView, tout en maintenant les proportions. Cependant, assurez-vous de définir l'image sur ImageView en utilisant Android:src="..." plutôt que Android:background="...". src= permet de redimensionner l’image en conservant les proportions, mais background= de la redimensionner et de la déformer pour l’adapter exactement à la taille de la vue. (Vous pouvez cependant utiliser un arrière-plan et une source en même temps, ce qui peut être utile pour afficher un cadre autour de l'image principale, à l'aide d'un seul ImageView.)

  2. Vous devriez également voir Android:adjustViewBounds pour que ImageView se redimensionne lui-même pour s’adapter à l’image redimensionnée. Par exemple, si vous avez une image rectangulaire dans ce qui serait normalement un carré ImageView, adjustViewBounds = true le redimensionnera également. Cela affecte ensuite la manière dont les autres vues sont disposées autour de la vue Image.

    Ensuite, comme Samuh l’a écrit, vous pouvez modifier la façon dont il redimensionne les images par défaut à l’aide du paramètre Android:scaleType. En passant, le moyen le plus simple de découvrir comment cela fonctionne aurait tout simplement été d’expérimenter vous-même! N'oubliez pas de regarder les dispositions de l'émulateur lui-même (ou d'un téléphone réel), car la prévisualisation dans Eclipse est généralement fausse.

724
Steve Haley

Voir Android:adjustViewBounds .

Définissez-la sur true si vous souhaitez que ImageView ajuste ses limites pour conserver le rapport de format de son dessin.

260
Gratzi

À quiconque ayant ce problème particulier. Vous avez une ImageView (ou autre View) pour laquelle vous voulez une largeur de fill_parent et une hauteur proportionnellement

Ajoutez ces deux attributs à votre ImageView:

Android:adjustViewBounds="true"
Android:scaleType="centerCrop"

Et définissez la largeur ImageView sur fill_parent et la hauteur sur wrap_content.

Aussi, si vous ne voulez pas que votre image soit recadrée, essayez ceci:

 Android:adjustViewBounds="true"
 Android:layout_centerInParent="true"
155
Kevin Parker

Si vous voulez une ImageView qui puisse être agrandie et réduite tout en conservant les proportions correctes, ajoutez ceci à votre XML:

Android:adjustViewBounds="true"
Android:scaleType="fitCenter"

Ajoutez ceci à votre code:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

Cela m'a pris un certain temps pour que cela fonctionne, mais cela semble fonctionner dans les cas où l'image est plus petite que la largeur de l'écran et plus grande que la largeur de l'écran, et cela ne met pas l'image en boîte.

50
Kevin

Cela a fonctionné pour moi:

Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:maxWidth="39dip"
Android:scaleType="centerCrop"
Android:adjustViewBounds ="true"
11
Mike6679

Code ci-dessous Travailler pour une image à l’échelle en tant que rapport de format:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);
8
Mukesh Parmar

cela a résolu mon problème

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
7
shafiq-ur-rehman

Jetez un coup d’œil à ImageView.ScaleType pour contrôler et comprendre la façon dont le redimensionnement se produit dans une ImageView. Lorsque l'image est redimensionnée (tout en conservant son format), il est probable que la hauteur ou la largeur de l'image devienne inférieure aux dimensions de ImageView

7
Samuh

Utilisez ces propriétés dans ImageView pour conserver les proportions:

Android:adjustViewBounds="true"
Android:scaleType="fitXY"

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:adjustViewBounds="true"
    Android:scaleType="fitXY"
    />
5
Atif Mahmood

J'ai une image plus petite que l'écran. Pour qu'il soit étiré proportionnellement au maximum et centré dans la vue, je devais utiliser le code suivant:

<ImageView
    Android:id="@+id/my_image"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_centerInParent="true"
    Android:adjustViewBounds="true"
    Android:layout_weight="1"
    Android:scaleType="fitCenter" />

Sachez toutefois que si vous avez une disposition relative et que certains éléments sont placés au-dessus ou au-dessous du ImageView, ils seront probablement recouverts par l'image.

4
halxinate

Pour ceux d'entre vous qui veulent que l'image corresponde exactement à la visualisation d'image avec une mise à l'échelle appropriée et aucune utilisation de recadrage

imageView.setScaleType(ScaleType.FIT_XY);

où imageView est la vue représentant votre ImageView

3
oneConsciousness

Vous pouvez calculer la largeur de l'écran. Et vous pouvez mettre à l'échelle bitmap.

 public static float getScreenWidth(Activity activity) {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        float pxWidth = outMetrics.widthPixels;
        return pxWidth;
    }

calculer la largeur de l'écran et la hauteur de l'image redimensionnée par la largeur de l'écran.

float screenWidth=getScreenWidth(act)
  float newHeight = screenWidth;
  if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
     newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
  }

Après vous pouvez mettre à l'échelle bitmap.

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);
3
mustafasevgi

Lorsque vous effectuez cette opération par programme, veillez à appeler les setters dans le bon ordre:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
3
lukas

Si vous voulez que votre image occupe le maximum d’espace possible, alors la meilleure option serait

Android:layout_weight="1"
Android:scaleType="fitCenter"
2
Mohsen Afshin

J'ai un algorithme pour redimensionner un bitmap afin d'adapter au mieux les dimensions du conteneur tout en conservant son rapport de format. S'il vous plaît trouver ma solution ici

J'espère que cela aide quelqu'un dans la voie!

1
Parth Kapoor

Essayez d’utiliser Android:layout_gravity pour ImageView:

Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:layout_gravity="center_vertical|center_horizontal"
Android:layout_weight="1"

L'exemple ci-dessus a fonctionné pour moi.

1
ITisha

Vous n'avez pas besoin de code Java. Vous devez juste:

<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="centerCrop" />

La clé est dans le parent du match pour la largeur et la hauteur

1
Romu Dizzy

Vous pouvez redimensionner une image qui réduira également la taille de votre image . Il existe une bibliothèque pour cette application, vous pouvez la télécharger et l’utiliser . https://github.com/niraj124124/Images-Files-scale -and-compress.git

Comment utiliser 1) Importez le compresseur-v1.0. jar à votre projet . 2) Ajoutez l'exemple de code ci-dessous pour tester . ResizeLimiter resize = ImageResizer.build (); resize.scale ("inputImagePath", "outputImagePath", imageWidth, imageHeight); Plusieurs autres méthodes existent selon vos besoins.

0
Niraj

J'utilise ceci: 

<ImageView
Android:id="@+id/logo"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_centerInParent="true"
Android:scaleType="centerInside"
Android:src="@drawable/logo" />
0
Flavio Capaccio

Si la qualité de l’image diminue en: Utilisation

Android:adjustViewBounds="true"

au lieu de 

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
0
Sumit Singh

Passez votre ImageView et basé sur la hauteur et la largeur de l'écran, vous pouvez le faire 

    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }

0
user2100931

en cas d'utilisation de cardviewpour arrondir imageview et de Android:layout_height fixe pour en-tête, cela m'a permis de charger l'image avec Glide

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
             xmlns:tools="http://schemas.Android.com/tools"
             Android:layout_width="match_parent"
             Android:layout_height="220dp"
             xmlns:card_view="http://schemas.Android.com/apk/res-auto"
             >

    <Android.support.v7.widget.CardView
            Android:id="@+id/card_view"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center|top"
            card_view:cardBackgroundColor="@color/colorPrimary"
            card_view:cardCornerRadius="10dp"
            card_view:cardElevation="10dp"
            card_view:cardPreventCornerOverlap="false"
            card_view:cardUseCompatPadding="true">

        <ImageView
                Android:adjustViewBounds="true"
                Android:maxHeight="220dp"
                Android:id="@+id/iv_full"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:scaleType="fitCenter"/>

    </Android.support.v7.widget.CardView>
</FrameLayout>
0
lvl4fi4

Voici comment cela a fonctionné pour moi dans ConstraintLayout:

<ImageView
    Android:id="@+id/myImg"
    Android:layout_width="300dp"
    Android:layout_height="300dp"
    Android:scaleType="fitCenter"
    Android:adjustViewBounds="true"/>

Puis dans le code, je définis le drawable comme:

ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));

Cela correspond parfaitement à l'image en fonction de son rapport de format et le garde au centre.

0
Jeet