Quelle est la différence entre getWidth / Height () et getMeasuredWidth / Height () dans le SDK Android?


88

La documentation Android indique qu'il existe deux tailles pour une vue, les dimensions mesurées et les dimensions du dessin . La dimension mesurée est celle calculée dans la passe de mesure ( méthode onMeasure ), tandis que les dimensions du dessin sont la taille réelle à l'écran. En particulier, la documentation indique que:

Ces valeurs peuvent, mais pas nécessairement, être différentes de la largeur et de la hauteur mesurées.

Donc, ma question est: qu'est-ce qui pourrait rendre la dimension du dessin différente de la dimension mesurée? Si la méthode onMeasure (int, int) respecte les exigences de mise en page (données comme paramètres widthMeasureSpec et heightMeasureSpec , comment le SDK pourrait-il décider que la vue doit avoir une taille de dessin différente?

De plus, comment / où dans le code source Android la largeur / hauteur mesurée est-elle utilisée pour calculer la largeur / hauteur du dessin? J'ai essayé de regarder dans le code source de View , mais je ne peux pas comprendre comment la largeur / hauteur mesurée est utilisée pour calculer la largeur / hauteur finale. Peut-être que cela a quelque chose à voir avec le rembourrage, mais je ne suis pas sûr.


Je pense que ces mesures peuvent être différentes au cas où un parchemin est ajouté à la vue.
Yury

Peut-être, mais j'ai développé un ViewGroup personnalisé, et cela se produit dans mon code. Je ne traite pas de défilement jusqu'au moment où ce problème se produit. Je pense donc qu'il devrait y avoir plus qu'un simple défilement impliqué.
lgfischer

Je confirme, j'ai aussi développé un ViewGroup personnalisé pour forcer un rapport hauteur / largeur donné: j'ai forcé la largeur et la hauteur mesurées (inférieures ou égales alors proposées), mais j'ai eu comme résultat la largeur et la hauteur réelles non modifiées (pas celles mesurées). Aucune relation avec le scroll. Je ne peux vraiment pas trouver un moyen de forcer la largeur et la hauteur réelles.
ARLabs

Réponses:


96

Comme son nom l'indique, la largeur / hauteur mesurée est utilisée pendant la phase de mesure et de mise en page.

Laissez-moi vous donner un exemple,

Un widget est invité à se mesurer, le widget dit qu'il veut être de 200 px par 200 px. Ceci est mesuré Largeur / Hauteur.

Pendant la phase de mise en page, c'est-à-dire dans la méthode onLayout. La méthode peut utiliser la largeur / hauteur mesurée de ses enfants ou affecter une nouvelle largeur / hauteur en appelant la méthode de disposition de la vue.

disons que la méthode onLayout appelle childview.layout (0,0,150,150) maintenant la largeur / hauteur de la vue est différente de la largeur / hauteur mesurée.

Je suggérerais de ne pas utiliser la méthode onLayout mesuréWidth / height.

résumer .

  1. onMeasure -> configure la largeur mesurée / la hauteur mesurée
  2. onLayout -> définit la largeur / hauteur du widget.


public void View.layout(int l, int t, int r, int b)
semble en outre être le lieu où l'attribution de la position et de la taille se produit.


autrement dit, nous devrions toujours utiliser getWidth / getHeight pour obtenir la dimension "réelle" d'une vue, n'est-ce pas?
suitianshi

1
Oui, mais si vous effectuez votre propre mise en page, vous devez utiliser la valeur MeasuredWidth au lieu de width.
Prakash Nadar

Alors, quel est le but de définir des dimesions dans onMeasure ()? Je veux dire, la passe de mise en page est la dernière, dans laquelle vous définissez les dimensions finales de la vue, possibliy indépendamment des dimensions mesurées
edoardotognoni

@edoardotognoni cela dépend de la mise en page (LinearLayout, RelativeLayout ou votre mise en page personnalisée), pour donner la taille et la position correctes à la vue.
Prakash Nadar

Ok, disons que la vue dit "j'aimerais ces dimensions". Alors que la mise en page dit "Vous aurez ces dimensions". Est ce juste?
edoardotognoni
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.