Próbuję zastosować animację do widoku w mojej aplikacji na Androida po utworzeniu mojej aktywności. Aby to zrobić, muszę określić bieżący rozmiar widoku, a następnie skonfigurować animację, aby skalować od bieżącego rozmiaru do nowego rozmiaru. Ta część musi być wykonana w czasie wykonywania, ponieważ widok skaluje się do różnych rozmiarów w zależności od danych wprowadzonych przez użytkownika. Mój układ jest zdefiniowany w XML.
Wydaje się, że jest to łatwe zadanie i jest wiele pytań SO dotyczących tego, ale żadne z nich oczywiście nie rozwiązało mojego problemu. Więc może brakuje mi czegoś oczywistego. Uzyskuję uchwyt do mojego widoku poprzez:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
Działa to dobrze, ale podczas rozmowy getWidth()
, getHeight()
, getMeasuredWidth()
, getLayoutParams().width
, itd., Wszystkie one powrót 0. Próbowałem również ręcznie dzwoniąc measure()
na widoku, a następnie wywołaniu getMeasuredWidth()
, ale to nie ma znaczenia.
Próbowałem wywołać te metody i sprawdzić obiekt w debugerze w mojej aktywności onCreate()
i w onPostCreate()
. Jak mogę określić dokładne wymiary tego widoku w czasie wykonywania?
źródło
match_parent
). W tym przypadku prostszym rozwiązaniem, które można bezpiecznie wywołać nawet przed narysowaniem widoku (np. Z metody onCreate () Twojego działania) jest po prostu użycie Display.getSize (); Szczegółowe informacje można znaleźć na stackoverflow.com/a/30929599/5025060 . Wiem, że nie o to prosił @NikReiman, po prostu zostawiając notatkę tym, którzy mogą być w stanie użyć tej prostszej metody.Odpowiedzi:
Użyj ViewTreeObserver w widoku, aby poczekać na pierwszy układ. Dopiero po pierwszym układzie getWidth () / getHeight () / getMeasuredWidth () / getMeasuredHeight () zadziała.
źródło
removeGlobalOnLayoutListener(this);
? ponieważ jest przestarzały.W zależności od scenariusza istnieje wiele rozwiązań:
Przykładowe użycie:
Jeśli znasz rozmiar pojemnika:
Jeśli piszesz w Kotlinie, możesz skorzystać z kolejnej funkcji, która za kulisami działa dokładnie tak
runJustBeforeBeingDrawn
, jak napisałem:Zauważ, że musisz dodać to do gradle (znajdziesz tutaj ):
źródło
OnPreDrawListener
. Testowany przypadek, gdy chcesz uruchomić kod z ActivityonCreate()
i od razu uruchomisz aplikację w tle. Łatwe do powtórzenia, szczególnie na wolniejszym urządzeniu. Jeśli zastąpiOnPreDrawListener
sięOnGlobalLayoutListener
- nie będzie widać ten sam problem.ViewTreeObserver
lubpost
, w moim przypadku numer 2 pomógł (view.measure
).Czy dzwonisz,
getWidth()
zanim widok zostanie faktycznie przedstawiony na ekranie?źródło
onSizeChange()
zdarzenie, aby poznać rzeczywisty rozmiar? Wydaje się, że to trochę przesada ... chociaż w tym momencie desperacko pragnę, aby kod działał, więc warto spróbować.onPostCreate()
który jest uruchamiany po całkowitym utworzeniu i uruchomieniu widoku.Na podstawie porady @ mbaird znalazłem działające rozwiązanie, podklasując
ImageView
klasę i nadpisująconLayout()
. Następnie stworzyłem interfejs obserwatora, który zaimplementował moje działanie i przekazałem odniesienie do siebie do klasy, co pozwoliło jej powiedzieć, kiedy działanie zostało zakończone.Nie jestem w 100% przekonany, że to najlepsze rozwiązanie (stąd jeszcze nie zaznaczam tej odpowiedzi jako poprawnej), ale działa i według dokumentacji jest to pierwszy raz, kiedy można znaleźć rzeczywisty rozmiar widoku.
źródło
Oto kod do pobierania układu poprzez przesłanianie widoku, jeśli API <11 (API 11 zawiera funkcję View.OnLayoutChangedListener):
źródło
Możesz sprawdzić to pytanie . Można użyć
View
„s post () metody.źródło
Użyj poniższego kodu, podaje rozmiar widoku.
źródło
To działa dla mnie w moim
onClickListener
:źródło
Byłem też stracił około
getMeasuredWidth()
igetMeasuredHeight()
getHeight()
igetWidth()
przez długi czas .......... później okazało się, że coraz szerokość widoku i wysokość wonSizeChanged()
jest najlepszym sposobem, aby to zrobić ........ można dynamicznie uzyskać BIEŻĄCĄ szerokość i BIEŻĄCĄ wysokość swojego widoku, zastępująconSizeChanged(
metodę).może zechcesz rzucić okiem na ten, który zawiera rozbudowany fragment kodu. Nowy post na blogu: jak uzyskać wymiary szerokości i wysokości niestandardowego widoku (rozszerza widok) w systemie Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html
źródło
Na ekranie można wyświetlić zarówno pozycję, jak i wymiar widoku
źródło
u mnie działa perfekcyjnie:
źródło