Sobes.tech
Middle

Разкажи ми за методите, които прерисуват View.

sobes.tech AI

Отговор от AI

Методи:

  • invalidate(): Маркира изгледа като "мръсен", изискващ повторно рисуване. Планира изпълнението на onDraw() в бъдеще. Повторното рисуване се извършва в основния поток. Използва се, ако външните свойства на изгледа (цвят, фон и т.н.) се променят.
  • postInvalidate(): Подобно на invalidate(), но може да бъде извикано от всеки поток, не само от основния. Безопасно за използване във фонови потоци.
  • requestLayout(): Маркира изгледа като "недействителен", изискващ преизчисляване на размера и позицията му. Планира изпълнението на onMeasure() и onLayout(), след което onDraw(). Използва се, ако размерите или позицията на изгледа се променят (например при добавяне/премахване на деца в ViewGroup).

Сравнение на методите:

Метод Викащ поток Преизчисляване на layout Повторно рисуване
invalidate() UI поток Не Да
postInvalidate() Всеки поток Не Да
requestLayout() UI поток Да Да (след layout)

Пример за използване на invalidate():

// Смяна на цвета на изгледа и искане за повторно рисуване
myView.setBackgroundColor(Color.RED)
myView.invalidate()

Пример за използване на requestLayout():

// Добавяне на дете към LinearLayout и искане за преизчисляване на layout и повторно рисуване
val newTextView = TextView(context)
linearLayout.addView(newTextView)
linearLayout.requestLayout()