Sobes.tech
Middle

Opowiedz o metodach, które rysują ponownie widok.

sobes.tech AI

Odpowiedź od AI

Metody:

  • invalidate(): Oznacza widok jako "brudny", wymagający ponownego rysowania. Planowane jest wykonanie onDraw() w przyszłości. Rysowanie odbywa się w głównym wątku. Używane, gdy zmieniają się zewnętrzne właściwości widoku (np. kolor, tło itp.).
  • postInvalidate(): Podobnie do invalidate(), ale może być wywołane z dowolnego wątku, nie tylko z głównego. Bezpieczne do użycia w wątkach tła.
  • requestLayout(): Oznacza widok jako "nieprawidłowy", wymagający ponownego obliczenia rozmiaru i położenia. Planowane jest wykonanie onMeasure() i onLayout(), a następnie onDraw(). Używane, gdy zmieniają się rozmiary lub pozycja widoku (np. przy dodawaniu/usuwaniu elementów potomnych w ViewGroup).

Porównanie metod:

Metoda Wątek wywołania Ponowne obliczenie layout Rysowanie
invalidate() Wątek UI Nie Tak
postInvalidate() Dowolny wątek Nie Tak
requestLayout() Wątek UI Tak Tak (po layout)

Przykład użycia invalidate():

// Zmiana koloru widoku i żądanie ponownego rysowania
myView.setBackgroundColor(Color.RED)
myView.invalidate()

Przykład użycia requestLayout():

// Dodanie elementu potomnego do LinearLayout i żądanie ponownego obliczenia layoutu i rysowania
val newTextView = TextView(context)
linearLayout.addView(newTextView)
linearLayout.requestLayout()