278 votes

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 mettre à l'échelle l'image selon la hauteur et la largeur de la vue d'image. Je ne veux pas qu'elle donne des valeurs par défaut, car si je modifie sa hauteur et sa largeur, je dois également le faire dans le code.

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

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

Cela me renvoie 0 même si la hauteur et la largeur sont par défaut.

0 votes

"Comme je ne veux pas donner de valeurs par défaut parce que si je change la hauteur et la largeur, je dois aussi les changer dans le code" - lequel peut changer ? la vue de l'image ou les images stockées ?

0 votes

Ne pouvez-vous pas simplement utiliser android:scaleType="centerInside" ?

0 votes

J'avais un problème similaire, mais j'ai constaté que les réponses postées ici ne m'ont pas aidé. J'ai posté ma propre question, qui a reçu une réponse [ici][1]. [1] : stackoverflow.com/questions/6590031/

228voto

kcoppock Points 57219

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

8 votes

Très bon code mon frère et +1 logique pour cela. Vous pouvez également réaliser ceci en définissant la propriété ImageView Android:adjustViewBounds="true" à true :)

0 votes

Mais pendant le débogage, le pointeur ne va pas à l'improviste surPreDraw(), pourquoi ?

0 votes

Bonjour, c'est génial mais comment puis-je définir des variables que je peux utiliser ailleurs dans l'activité ? Si je définis des variables d'instance, elles ne sont pas disponibles tant que l'activité onCreate n'est pas terminée.

31voto

AZ_ Points 7127

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

Android:adjustViewBounds="true" (en anglais)

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

4 votes

@jww Je ne réponds pas vraiment aux votants négatifs :p, Lisez d'abord getWidth et getMeasured dans la documentation d'Android. Ensuite, venez voter contre les gens.

14voto

Pedro Loureiro Points 6889

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

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

0 votes

J'ai donné une hauteur et une largeur par défaut à ImageView mais lorsque j'essaie de les obtenir dans le code, il me renvoie 0. Je pense que je dois d'abord gonfler ImageView. mais comment faire ?

0 votes

J'en parle dans ma réponse. Relisez-la :) Je pense que votre point de vue est déjà gonflé. Le voyez-vous ? Si oui, c'est qu'elle est gonflée.

6voto

Ian Leslie Points 524

Je pense que vous pouvez laisser le système d'exploitation Android s'en occuper pour vous. Définissez le type d'échelle de l'ImageView à fitXY et l'image qu'il 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" />

-2voto

chirag shah Points 4188

Mon ami, vous n'obtenez pas la hauteur de l'image stockée dans la base de données, mais vous obtenez la hauteur de la vue. Pour obtenir la hauteur de l'image, vous devez créer un bitmap à partir de l'image de la base de données, puis vous pouvez récupérer la hauteur et la largeur de la vue.

2 votes

Je connais la hauteur et la largeur de l'image mais je veux connaître la hauteur et la largeur de l'ImageView afin de pouvoir la mettre à l'échelle en conséquence. J'espère que vous comprenez ce que je veux dire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X