Wstawiłem wywołanie Log.d() do onDraw() mojego rozszerzonego widoku, dzięki czemu mogłem zobaczyć, jak często i kiedy jest wywoływana. Jest wywoływany przy tworzeniu widoku, co nie jest zaskakujące. Ale potem zauważam, że jest wywoływana przy każdym odczycie obsługiwanym przez onTouchEvent(), mimo że mój kod nie robi nic, co jest zdalnie powiązane z grafiką. Jednak w widoku documentation dla widoków nie mogę znaleźć niczego na temat wywołania metody onDraw(). Nie martwię się o mój konkretny projekt tutaj (nie powoduje to dla mnie problemu), chciałbym tylko wiedzieć, czy istnieje gdzieś lista lub coś, co pokazuje kolejność operacji dla widoku, w szczególności co powoduje onDraw(), aby uzyskać wywołanie.View.onDraw() --- kiedy zostanie wywołany?
Odpowiedz
AFAIK, widok za OnDraw() jest wywoływana, gdy:
- Widok jest początkowo sporządzony
- Ilekroć invalidate() nazywany jest na widoku
Invalidate może być wywołana przez Ciebie lub system w razie potrzeby. Na przykład wiele widoków zmienia sposób, w jaki wyglądają one naTouch, jak EditText uzyskujący kontur i kursor lub przycisk będący w stanie wciśniętym. W związku z tym widoki są przerysowywane w dotyku.
Zgadzam się, że byłoby miło mieć dokument, który szczegółowo funkcjonowanie Views, a jeśli taki istnieje i ktoś wie, gdzie go znaleźć, daj nam znać.
Jeśli ustawisz rozciągliwej tła dla widoku, a następnie View wyciągnie to dla was przed wywołaniem powrotem do jej metody OnDraw().
onAttachedToWindow() jest wywoływana gdy widok jest przymocowany do okna. W tym momencie ma powierzchnię i zacznie rysować. Zauważ, że ta funkcja ma być wywołana przed onDraw (android.graphics.Canvas), jednak może być nazywana w dowolnym czasie przed pierwszym onDraw - włączając przed lub po onMeasure (int, int).
invalidate() zaznaczyć obszar zdefiniowany przez brudne jako wymagające, jakie należy wyciągnąć. Jeśli widok jest widoczny, onDraw (android.graphics.Canvas) zostanie wywołany pod adresem w przyszłości.
Czy sposób, w jaki możemy przechwycić przed wywołaniem z powrotem naDraw(), czy chcesz sprawdzić moje pytanie http://stackoverflow.com/questions/19052952/bitmap-change-will -make-view-auto-refresh-before-ondraw-i-niezależnie-nieprawidłowe – VinceStyling
Ważne jest, aby pamiętać, jest to, że starają się zminimalizować powołanie unieważnić function() bez argumentów. Zamiast tego spróbuj zmaksymalizować funkcję unieważniającą() z czterema argumentami. Cały widok jest bardzo drogi. Drugi wariant odświeża tylko część widoku.
onDraw()
nazywa kiedy invalidate()
nazywa.
Ale powinieneś wiedzieć dla ViewGroups: onDraw()
nie będzie nazywać się, jak się spodziewasz. Raczej, onDispatchDraw()
.
Jednak w ViewGroup można wywołać setWillNotDraw(false)
w konstruktorze, aby wywołać onDraw()
na invalidate()
.
Spójrz na this answer
dodatkowy do powyższego: Miękka klawiatura powoduje View.invalidate() -> View.onDraw() sekwencja po zmianie rozmiaru okna, aby sensownie pomieścić „Klawiatura” . Niestandardowy View.onDraw() musi pozostać w stanie przewidującym taką możliwość.
Takie zjawisko wyjaśnia, dlaczego aplikacja, którą opracowałeś i przetestowałeś na tablecie z klawiaturą bluetooth, trafiła do psów, gdy dotarła do realnego świata (-:
- 1. Kiedy IEnumerable.GetEnumerator zostanie wywołany zamiast IEnumerable <T> .GetEnumerator?
- 2. gestureRecognizer: shouldReceiveTouch: nie zostanie wywołany
- 3. EKEventViewDelegate didCompleteWithAction nie zostanie wywołany
- 4. Destruktor nigdy nie zostanie wywołany
- 5. Android ViewPager's onPageScrollStateChanged nigdy nie zostanie wywołany
- 6. collectionView: cellForItemAtIndexPath: nigdy nie zostanie wywołany
- 7. Czy zostanie automatycznie wywołany konstruktor klasy podstawowej?
- 8. W jakich okolicznościach zostanie wywołany operator konwersji typu?
- 9. Kiedy strona PhoneApplicationPage zostanie usunięta?
- 10. Kiedy zostanie wydany Scala 2.8.0?
- 11. SpriteBatch: "Begin nie może zostać wywołany ponownie, dopóki nie zostanie wywołany End."
- 12. Start programu MediaRecorder(), jeśli zostanie wywołany zbyt szybko
- 13. Jak ustawić alias skryptu PowerShell, który zostanie wywołany z monitu?
- 14. Dlaczego deskryptor w języku Python __set__ nie zostanie wywołany
- 15. NSURLConnectionDelegate willSendRequestForAuthenticationChallenge nie zostanie wywołany na iOS 8
- 16. Współbieżność Mysql: co się stanie, gdy zostanie wywołany zablokowany stolik?
- 17. , który konstruktor klasy String zostanie wywołany, gdy obiekt String zostanie utworzony za pomocą String literal
- 18. View.invalidate() nie wydaje się wywoływać View.onDraw()
- 19. Kiedy zostanie usunięte $ _FILES ['file'] ['tmp_name']?
- 20. Kiedy VS 2010 RC zostanie wydany?
- 21. C++ destructor: kiedy pamięć zostanie zwolniona?
- 22. Kiedy metoda dispused nie zostanie wywołana?
- 23. Kiedy jest wywołany konstruktor statyczny w języku C#?
- 24. Jak ustawić "Domyślną akcję" dla mojego kontrolera, który zostanie wywołany, gdy żadne inne działanie nie zostanie dopasowane?
- 25. didMoveToParentViewController wywołany dwukrotnie
- 26. Jak określić, kiedy pamięć obiektu Java zostanie zwolniona?
- 27. python: Jak wykryć, kiedy moja nić zostanie sierotą?
- 28. Kiedy zadanieExecutionVetoed z JobListener zostanie wykonane w Quartz Scheduler?
- 29. Informacje o tym, kiedy zostanie utworzony listView systemu Android,
- 30. Jak się dowiedzieć, kiedy zmienna instancji zostanie ustawiona w Ruby
Nie dotyczy to 'ViewGroup's. Zobacz moją odpowiedź http : //stackoverflow.com/a/34367199/1642079 –