web-dev-qa-db-fra.com

Comment obtenir la largeur et la hauteur d'un Android.widget.ImageView?

╔══════════════════════════════════════════════╗   ^
║ ImageView    ╔══════════════╗                ║   |
║              ║              ║                ║   |
║              ║ Actual image ║                ║   |
║              ║              ║                ║   |60px height of ImageView
║              ║              ║                ║   |
║              ║              ║                ║   |
║              ╚══════════════╝                ║   |
╚══════════════════════════════════════════════╝   
<------------------------------------------------>
                   90px width of ImageView

J'ai une vue d'image avec une hauteur et une largeur par défaut, les images sont stockées dans la base de données et je veux redimensionner l'image en fonction de la largeur de l'image Imageview. Comme je ne veux pas qu'il donne des valeurs par défaut parce que chaque fois que je change sa hauteur et sa largeur, je dois aussi le changer dans le code.

J'essaie d'obtenir la hauteur et la largeur de ImageView mais 0 me est renvoyé dans les deux cas.

int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();

cela me retourne 0 même il a la hauteur et la largeur par défaut

269
AZ_

Ma réponse sur cette question pourrait vous aider:

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

Vous pouvez ensuite ajouter votre travail de mise à l'échelle d'image à partir de la méthode onPreDraw ().

217
kcoppock

Je viens de définir cette propriété et maintenant Android le système d'exploitation prend soin de tout.

Android: adjustViewBounds = "true"

Utilisez ceci dans votre layout.xml où vous avez planté votre ImageView: D

29
AZ_

Je pourrais obtenir la largeur et la hauteur de l'image par son dessinable;

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();
22
Rashid

Si les dimensions de l'ImageView sont égales à 0, c'est parce que lorsque vous les interrogez, la vue n'a toujours pas effectué les étapes de disposition et de mesure. Vous avez seulement dit à la vue comment elle se "comporterait" dans la présentation, mais elle ne calculait toujours pas où placer chaque vue.

Comment décidez-vous de la taille à donner à la vue image? Ne pouvez-vous pas simplement utiliser l'une des options de dimensionnement mises en œuvre de manière native?

13
Pedro Loureiro

Poster sur le fil de l'interface utilisateur fonctionne pour moi.

final ImageView iv = (ImageView)findViewById(R.id.scaled_image);

iv.post(new Runnable() {
            @Override
            public void run() {
                int width = iv.getMeasuredWidth();
                int height = iv.getMeasuredHeight();

            }
});
11
element6

votre fichier xml:

 <ImageView Android:id="@+id/imageView"
               Android:layout_width="wrap_content"
               Android:layout_height="wrap_content"
               Android:src="@drawable/image"
               Android:scaleType="fitXY"
               Android:adjustViewBounds="true"/>

votre fichier Java:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
     int width = imageView.getDrawable().getIntrinsicWidth();
     int   height = imageView.getDrawable().getIntrinsicHeight();
4
omor

La méthode la plus simple consiste à obtenir la largeur et la hauteur d'un ImageView dans la méthode onWindowFocusChanged de l'activité.

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    height = mImageView.getHeight();
    width = mImageView.getWidth();

}
4
Aqib

Je pense que vous pouvez laisser le système d'exploitation Android se charger de cela pour vous. Définissez le type d’échelle dans ImageView sur fitXY et l’image qu’elle affiche sera redimensionnée pour correspondre à la taille actuelle de la vue.

<ImageView 
    Android:layout_width="90px" 
    Android:layout_height="60px"
    Android:scaleType="fitXY" />
4
Ian Leslie

Si vous avez créé plusieurs images dynamiquement, essayez celui-ci:

// initialiser votre tableau d'images

private ImageView myImages[] = new ImageView[your_array_length];

// créer par programme et ajouter à la vue parent

 for (int i = 0; i < your_array_length; i++) {
                myImages[i] = new ImageView(this);
                myImages[i].setId(i + 1);
                myImages[i].setBackgroundResource(your_array[i]);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                        frontWidth[i], frontHeight[i]);
                ((MarginLayoutParams) params).setMargins(frontX_axis[i],
                        frontY_axis[i], 0, 0);
                myImages[i].setAdjustViewBounds(true);
                myImages[i].setLayoutParams(params);

                if (getIntent() != null && i != your_array,length) {
                    final int j = i;
                    myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        public boolean onPreDraw() {
                            myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
                    finalHeight = myImages[j].getMeasuredHeight();
                        finalWidth = myImages[j].getMeasuredWidth();
                    your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
                            return true;
                        }
                    });
                }
                your_parent_layout.addView(myImages[i], params);
            }

// C'est ça. Bonne codage.

1
Hiren Patel