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

272
╔══════════════════════════════════════════════╗   ^
 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 db et je veux mettre l'image à l'échelle en fonction de la largeur de la hauteur 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 d'ImageView mais 0 me revient dans les deux cas.

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

cela me renvoie 0 même s'il a une hauteur et une largeur par défaut

AZ_
la source
«Comme je ne veux pas donner de valeurs par défaut car chaque fois que je change sa hauteur et sa largeur, je dois aussi la changer en code» - lequel peut-on changer? la vue d'image ou les images stockées?
Pedro Loureiro
ne pouvez-vous pas simplement utiliser android:scaleType="centerInside"?
bigstones
2
@nightcracker: Ce n'est pas ASCII.
Joey
7
@ Јοеу Quand j'ai dit "ASCII", je voulais dire "art ASCII", qui englobe plus d'art que celui consistant simplement en un jeu de caractères ASCII.
orlp
1
Cela ne répond pas directement à la question, mais si vous vous demandez pourquoi getHeight () / getWidth () retourne 0, ils retourneront toujours 0 si vous appelez ces méthodes avant que la vue ait été "dessinée", c'est-à-dire si vous deviez appeler ces méthodes dans onCreate (), il retournerait 0
audiojared

Réponses:

222

Ma réponse à 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 de l'image à partir de la méthode onPreDraw ().

Kevin Coppock
la source
8
très beau code frère et +1 logique pour ça. vous pouvez également y parvenir en définissant la propriété ImageView android: adjustViewBounds = "true" sur true :)
AZ_
Hé, mais pendant le débogage du pointeur, ne passez pas à côté de OnPreDraw (). Pourquoi en est-il ainsi?
Geetanjali
3
Je pense que vous devez ajouter vto.removeOnPreDrawListener (this); line inside onPreDraw ()
sagus_helgy
1
@ KK_07 voir la modification selon le commentaire de la victime. Il suffit de supprimer l'auditeur une fois que vous en avez terminé.
Kevin Coppock
6
comment attribuer des valeurs à finalHeight et finalWidth à l'intérieur d'une classe interne sans les rendre finales?
Chris
29

Je viens de définir cette propriété et maintenant Android OS s'occupe de tout.

android: adjustViewBounds = "true"

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

AZ_
la source
4
@jww Je ne réponds pas vraiment aux électeurs négatifs: p, Lisez d'abord sur getWidth et getMeasured dans la documentation Android. puis venez voter pour les gens.
AZ_
27

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

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();
Rashid
la source
14

La raison pour laquelle les dimensions de ImageView sont 0 est parce que lorsque vous les interrogez, la vue n'a toujours pas effectué les étapes de disposition et de mesure. Vous avez seulement indiqué à la vue comment elle "se comporterait" dans la mise en page, mais elle n'a toujours pas calculé où placer chaque vue.

Comment décidez-vous de la taille à donner à l'image? Ne pouvez-vous pas simplement utiliser l'une des options de mise à l'échelle implémentées en mode natif?

Pedro Loureiro
la source
J'ai donné la hauteur et la largeur par défaut à ImageView mais quand j'essaye de les obtenir dans le code, il me renvoie 0. Je pense que je dois d'abord gonfler ImageView. mais comment?
AZ_
J'en parle dans ma réponse. Relisez-le :) Je pense que votre vue est déjà gonflée. Peux-tu le voir? si vous le pouvez, alors c'est gonflé.
Pedro Loureiro
13

Publier 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();

            }
});
element6
la source
Très utile!
Xavi Jimenez
Faux. L'interrogation de la largeur et de la hauteur depuis l'interface utilisateur ne garantit pas que ces valeurs sont prêtes. L'inflation de la vue vient juste de se terminer dans votre échantillon, mais il se pourrait très bien qu'il en soit autrement
rommex
6

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();
omor
la source
5

Je pense que vous pouvez laisser le système d'exploitation Android s'en occuper pour vous. Définissez le type d'échelle sur ImageView sur fitXYet l'image qu'elle affiche sera dimensionnée pour s'adapter à la taille actuelle de la vue.

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

Le moyen le plus simple consiste à obtenir la largeur et la hauteur d'une ImageView dans la méthode onWindowFocusChanged de l'activité

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

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

}
Aqib
la source
1
onWindowFocusChanged fonctionne uniquement sur API18 et plus, et cela ne peut pas être le meilleur moyen ... cependant merci
Milad gh
1

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

// initialise votre tableau d'images

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

// crée par programmation et ajoute à 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 tout. Codage heureux.

Hiren Patel
la source
-2

mon ami par cela u n'obtient pas la hauteur de l'image stockée dans db.mais vous obtenez la hauteur de vue.pour obtenir la hauteur de l'image vous devez créer un bitmap à partir de l'image db, s et que vous pouvez récupérer la hauteur et la largeur de l'image

chikka.anddev
la source
2
Je connais la hauteur et la largeur de l'image, mais je veux connaître la hauteur et la largeur d'ImageView afin de pouvoir la mettre à l'échelle en conséquence. J'espère que vous comprenez mon point.
AZ_