Was ist der Unterschied zwischen getWidth / Height () und getMeasuredWidth / Height () im Android SDK?


85

In der Android-Dokumentation heißt es, dass es zwei Größen für eine Ansicht gibt, die gemessenen Abmessungen und die Zeichnungsabmessungen . Die gemessene Dimension ist die, in der berechneten Maßübergabe (die onMeasure Methode), während die Zeichnungsbemaßungen die tatsächliche Größe auf dem Bildschirm sind. Insbesondere heißt es in der Dokumentation:

Diese Werte können, müssen aber nicht von der gemessenen Breite und Höhe abweichen.

Meine Frage lautet also: Was könnte dazu führen, dass sich das Zeichnungsmaß von dem gemessenen Maß unterscheidet? Wenn die onMeasure (int, int) -Methode die Layoutanforderungen ( angegeben als Parameter widthMeasureSpec und heightMeasureSpec) berücksichtigt , wie kann das SDK entscheiden, dass die Ansicht eine andere Zeichnungsgröße haben soll?

Wie / wo im Android-Quellcode wird außerdem die gemessene Breite / Höhe verwendet, um die Breite / Höhe der Zeichnung zu berechnen? Ich habe versucht, in den Quellcode von View zu schauen , kann aber nicht herausfinden, wie die gemessene Breite / Höhe zur Berechnung der endgültigen Breite / Höhe verwendet wird. Vielleicht hat es etwas mit der Polsterung zu tun, aber ich bin mir nicht sicher.


Ich denke, dass diese Maßnahmen unterschiedlich sein können, wenn der Ansicht eine Schriftrolle hinzugefügt wird.
Yury

Vielleicht, aber ich habe eine benutzerdefinierte ViewGroup entwickelt, und dies geschieht in meinem Code. Ich beschäftige mich erst mit dem Scrollen, wenn dieses Verhalten auftritt. Ich denke also, dass es mehr als nur eine Schriftrolle geben sollte.
lgfischer

Ich bestätige, dass ich auch eine benutzerdefinierte ViewGroup entwickle, um ein bestimmtes Seitenverhältnis zu erzwingen: Ich habe die gemessene Breite und Höhe (niedriger oder gleich als vorgeschlagen) erzwungen, aber als Ergebnis hatte ich die tatsächliche Breite und Höhe nicht geändert (nicht die gemessenen). Keine Beziehung zur Schriftrolle. Ich kann wirklich keinen Weg finden, die tatsächliche Breite und Höhe zu erzwingen.
ARLabs

Antworten:


94

Wie der Name schon sagt, wird die gemessene Breite / Höhe während der Mess- und Layoutphase verwendet.

Lassen Sie mich ein Beispiel geben,

Ein Widget wird gebeten, sich selbst zu messen. Das Widget gibt an, dass es 200 x 200 Pixel groß sein soll. Dies wird mit Breite / Höhe gemessen.

Während der Layoutphase, dh in der onLayout-Methode. Die Methode kann die gemessene Breite / Höhe ihrer untergeordneten Elemente verwenden oder eine neue Breite / Höhe zuweisen, indem sie die Layoutmethode der Ansicht aufruft.

Angenommen, die onLayout-Methode ruft childview.layout (0,0,150,150) auf. Jetzt unterscheidet sich die Breite / Höhe der Ansicht von der gemessenen Breite / Höhe.

Ich würde empfehlen, die gemessene Breite / Höhe außerhalb der onLayout-Methode nicht zu verwenden.

zusammenfassen .

  1. onMeasure -> richtet die gemessene Breite / gemessene Höhe ein
  2. onLayout -> legt die Breite / Höhe des Widgets fest.

zusätzlich wahl
public void View.layout(int l, int t, int r, int b)
scheint Ort zu sein , wo die Zuordnung der Position und der Größe geschieht.


Das heißt, wir sollten immer getWidth / getHeight verwenden, um die "echte" Dimension einer Ansicht zu erhalten, oder?
Suitianshi

1
Ja, aber wenn Sie Ihr eigenes Layout erstellen, sollten Sie die gemessene Breite anstelle der Breite verwenden.
Prakash Nadar

Was ist also der Zweck, in onMeasure () Dimensionen zu setzen? Ich meine, der Layout-Durchgang ist der letzte, in dem Sie die endgültigen Abmessungen der Ansicht festlegen, möglicherweise unabhängig von den gemessenen Abmessungen
edoardotognoni

@edoardotognoni Es hängt vom Layout ab (LinearLayout, RelativeLayout oder Ihr benutzerdefiniertes Layout), um der Ansicht die richtige Größe und Position zu geben.
Prakash Nadar

Ok, sagen wir, die Ansicht sagt "Ich möchte diese Dimensionen". Während das Layout sagt "Sie werden diese Abmessungen haben". Ist es richtig?
Edoardotognoni
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.