Jaka jest różnica między getWidth / Height () i getMeasuredWidth / Height () w Android SDK?

88

Android Dokumentacja mówi , że nie ma dwóch rozmiarach dla widzenia zmierzonych wymiarów i wymiarów rysunkowych . Mierzony wymiar to ten obliczony w trakcie pomiaru ( metoda onMeasure ), podczas gdy wymiary rysunku to rzeczywisty rozmiar na ekranie. W szczególności dokumentacja mówi, że:

Wartości te mogą, ale nie muszą, różnić się od zmierzonej szerokości i wysokości.

Tak więc moje pytanie brzmi: co może sprawić, że wymiar rysunku będzie różny od wymiaru mierzonego? Jeśli metoda onMeasure (int, int) spełnia wymagania dotyczące układu (podane jako parametry widthMeasureSpec i heightMeasureSpec , w jaki sposób zestaw SDK może zdecydować, że widok powinien mieć inny rozmiar rysunku?

Ponadto, w jaki sposób / gdzie w kodzie źródłowym Androida zmierzona szerokość / wysokość jest używana do obliczenia szerokości / wysokości rysunku? Próbowałem zajrzeć do kodu źródłowego View , ale nie mogę dowiedzieć się, w jaki sposób zmierzona szerokość / wysokość jest używana do obliczenia ostatecznej szerokości / wysokości. Może ma to coś wspólnego z wyściółką, ale nie jestem pewien.

lgfischer
źródło
Myślę, że te miary mogą być inne w przypadku dodania przewijania do widoku.
Yury
Może, ale stworzyłem niestandardową ViewGroup i to dzieje się w moim kodzie. Nie mam do czynienia z scrollem aż do momentu, w którym takie zachowanie się pojawia. Myślę więc, że powinno to być coś więcej niż tylko przewijanie.
lgfischer
Potwierdzam, opracowuję również niestandardową grupę ViewGroup, aby wymusić dany współczynnik kształtu: wymusiłem zmierzona szerokość i wysokość (mniejsze lub równe niż proponowane), ale w rezultacie rzeczywista szerokość i wysokość nie uległy zmianie (nie zmierzone). Brak związku ze zwojem. Naprawdę nie mogę znaleźć sposobu na wymuszenie prawdziwej szerokości i wysokości.
ARLabs

Odpowiedzi:

96

Jak sama nazwa wskazuje, zmierzona szerokość / wysokość jest używana podczas fazy pomiaru i układania.

Podam przykład,

Widżet jest proszony o zmierzenie samego siebie. Widżet mówi, że chce mieć wymiary 200 na 200 pikseli. Jest to mierzone Szerokość / wysokość.

W fazie layoutu, czyli w metodzie onLayout. Metoda może korzystać z measurementWidth / height swoich elementów podrzędnych lub przypisywać nową szerokość / wysokość, wywołując metodę układu widoku.

powiedzmy, że metoda onLayout wywołuje childview.layout (0,0,150,150), teraz szerokość / wysokość widoku jest inna niż zmierzona szerokość / wysokość.

Sugerowałbym, aby nie używać mierzonej szerokości / wysokości poza metodą onLayout.

podsumowując.

  1. onMeasure -> konfiguruje MeasuringWidth / MeasuredHeight
  2. onLayout -> ustawia szerokość / wysokość widżetu.

dodatkowo
public void View.layout(int l, int t, int r, int b)
wydaje się być miejscem, w którym następuje przypisanie pozycji i rozmiaru.

Prakash Nadar
źródło
to znaczy zawsze powinniśmy używać getWidth / getHeight, aby uzyskać „rzeczywisty” wymiar widoku, prawda?
suitianshi
1
Tak, ale jeśli wykonujesz własne układy, powinieneś użyć MeasuringWidth zamiast width.
Prakash Nadar
Więc jaki jest cel ustawiania wymiarów wewnątrz onMeasure ()? Chodzi mi o to, że przepustka layoutu jest ostatnią, w której
ustalasz
@edoardotognoni zależy to od układu (LinearLayout, RelativeLayout lub układu niestandardowego), aby nadać widokowi prawidłowy rozmiar i położenie.
Prakash Nadar
Ok, powiedzmy, że widok mówi „Chciałbym mieć te wymiary”. Podczas gdy układ mówi „Będziesz mieć te wymiary”. Czy to jest poprawne?
edoardotognoni