web-dev-qa-db-fra.com

ImageView remplit la largeur du parent OR hauteur, mais maintient les proportions

J'ai une image carrée (même si ce problème s'applique également aux images rectangulaires). Je souhaite afficher l'image aussi grande que possible, en l'étirant si nécessaire, pour remplir leurs parents, tout en maintenant les proportions. L'image est plus petite que l'image. Le problème est que je ne peux pas étirer l'image et "faire correspondre" la hauteur et la largeur de ImageView.

Ceci est mon fichier de mise en page XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:padding="10dp">

    <ImageView Android:id="@+id/image"
               Android:layout_width="fill_parent"
               Android:layout_height="fill_parent"
               Android:adjustViewBounds="true"
               Android:scaleType="fitCenter"
               Android:layout_marginTop="10dp"/>

    <TextView Android:id="@+id/name"
              Android:layout_below="@id/image"
              Android:layout_alignLeft="@id/image"
              Android:layout_marginTop="20dp"
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:textSize="18dp"/>

    <TextView Android:id="@+id/name2"
              Android:layout_below="@id/name"
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:textSize="14dp"/>


</RelativeLayout>

J'ai utilisé de nombreuses combinaisons de fill_parent, wrap_content avec plusieurs scaleTypes: fitCenter, fitStart, fitEnd, centerInside et elles dessinent toutes les images dans le bon format, mais aucune d'entre elles n'agrandit réellement les images et ImageView lui-même, les affichages TextViews étant complètement supprimés de l'écran, des espaces vides dans ImageView, une image non redimensionnée ou une image rognée.

Je ne peux pas vraiment comprendre la bonne combinaison pour cela.

38
garbagecollector

Celles-ci:

Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Android:adjustViewBounds="true"

devrait redimensionner l'image et changer la taille des limites pour s'adapter à la nouvelle taille de l'image. Si cela ne se produit pas sur votre appareil, postez l'image que vous utilisez et sur quel appareil vous testez.

97
FoamyGuy

Utilisez ce code: Android:scaleType="fitXY"

Pour plus de détails sur la mise à l'échelle des images, regardez ce qui est proposé dans cet article ici

Résumé:

  • center

Centrer l'image dans la vue, mais ne pas mettre à l'échelle

enter image description here

  • centerCrop

Redimensionnez l'image de manière uniforme (conservez le format de l'image) de sorte que les deux dimensions (largeur et hauteur) de l'image soient égales ou supérieures à la dimension correspondante de la vue (moins le remplissage). L'image est ensuite centrée dans la vue

enter image description here

  • centerInside

Redimensionne l'image uniformément (conserve le rapport de format de l'image) de sorte que les deux dimensions (largeur et hauteur) de l'image soient égales ou inférieures à la dimension correspondante de la vue (moins le remplissage).

enter image description here

  • fitCenter

enter image description here

  • fitEnd

enter image description here

  • fitStart

enter image description here

  • fitXY

enter image description here

  • matrix

Échelle en utilisant la matrice d'image lors du dessin

enter image description here

plus de détails ici nouvel article 

44
Context

Utilisez ce code avec les paramètres de présentation de la vue comme wrap_content

Android: adjustViewBounds = "true"

J'espère que cela fonctionnera.

13
akashPatra

Ce code xml fonctionnera! Si vous indiquez que la largeur de vos applications est toujours identique à celle de la fenêtre, le Android:adjustViewBounds="true" définit la hauteur en fonction du rapport de l'image.

        <ImageView
        Android:adjustViewBounds="true"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:src="@drawable/screen"/>
8
Febin Mathew

J'ai eu le même problème, Android: AdjustViewBounds ne fait pas son travail et ayant un remplissage en haut de l'image. Dans une mise en page relative qui avait des valeurs match_parent pour la largeur et la hauteur, j'avais:

   <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:orientation="vertical" Android:layout_width="match_parent"
   Android:layout_height="match_parent"
   Android:background="@color/transparent">

   <ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:scaleType="fitStart"
    Android:adjustViewBounds="true" ...

J'ai changé la disposition relative en une disposition linéaire avec les valeurs wrap_content pour la largeur et la hauteur et maintenant c'est correct

    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
4
Laurie Trichet

Avez-vous essayé de l'ajuster par programmation? Je pense que cela fonctionne très bien si vous calculez la hauteur de votre TextViews et ajustez la hauteur et la largeur de l'image en fonction de cela.

private void adjustImageView()
{
    //Get the display dimensions
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    //TextView name
    TextView name = (TextView) findViewById(R.id.name);
    name.setText("your name text goes here");
    name.measure(0, 0);

    //name TextView height
    int nameH = name.getMeasuredHeight();

    //TextView name2
    TextView name2 = (TextView) findViewById(R.id.name2);
    name2.setText("your name2 text goes here");
    name2.measure(0, 0);

    //name2 TextView height
    int name2H = name2.getMeasuredHeight();

    //Original image
    Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image);

    //Width/Height ratio of your image
    float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight();

    //Calculate the new width and height of the image to display 
    int imageToShowHeight = metrics.heightPixels - nameH - name2H;
    int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight);

    //Adjust the image width and height if bigger than screen
    if(imageToShowWidth > metrics.widthPixels)
    {
        imageToShowWidth = metrics.widthPixels;
        imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
    }

    //Create the new image to be shown using the new dimensions 
    Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true);

    //Show the image in the ImageView
    ImageView image = (ImageView) findViewById(R.id.image);
    image.setImageBitmap(imageToShow);
}
3
slybloty

Définissez Android:layout_height="wrap_content" dans imageview . Pour créer une image avec une largeur égale à la largeur de l'écran et une hauteur proportionnellement définie en fonction du rapport de format, procédez comme suit. Ici, je mentionne comment charger image à imageview à partir de l’URL.

Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {

                        // creating the image that maintain aspect ratio with width of image is set to screenwidth.
                        int width = imageView.getMeasuredWidth();
                        int diw = resource.getWidth();
                        if (diw > 0) {
                            int height = 0;
                            height = width * resource.getHeight() / diw;
                            resource = Bitmap.createScaledBitmap(resource, width, height, false);
                        }
                                              imageView.setImageBitmap(resource);
                    }
                });

J'espère que cela t'aides.

0
Fathima km