2012-08-11 12 views
21

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

45

AFAIK, widok za OnDraw() jest wywoływana, gdy:

  1. Widok jest początkowo sporządzony
  2. 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ć.

+0

Nie dotyczy to 'ViewGroup's. Zobacz moją odpowiedź http : //stackoverflow.com/a/34367199/1642079 –

7
  • 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.

+0

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

1

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.

8

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

0

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 (-:

Powiązane problemy