Существуют несколько основных методов для управления перерисовкой View в Android:
invalidate(): Этот метод помечает текущий и все дочерние View как "грязные", требующие перерисовки. Система планирует проход отрисовки в будущем (обычно на следующем кадре). Используется, когда изменилось что-то, влияющее на внешний вид View (например, цвет, текст). Вызывается из любого потока.
postInvalidate(): Аналогичен invalidate(), но предназначен для вызова из фоновых потоков. Он отправляет сообщение в главный поток UI для выполнения invalidate().
requestLayout(): Этот метод указывает, что View требует перерасчета своего размера и положения. Он вызывает проход измерения и раскладки (measure and layout pass) после перерисовки. Используется, когда изменилось что-то, влияющее на размер или расположение View (например, добавление/удаление дочерних элементов, изменение padding). Вызывается только из главного потока UI.
Если изменилось как внешний вид, так и размер/положение View, часто достаточно вызвать requestLayout(), так как он обычно вызывает invalidate() в процессе. Однако, прямое изменение только внешнего вида требует только invalidate().
Пример использования invalidate():
java
Пример использования postInvalidate() из фонового потока:
java
Пример использования requestLayout():
java
Важно понимать жизненный цикл отрисовки View:
invalidate() или requestLayout().onMeasure().onLayout().onDraw().Метод invalidate() запускает шаги 6, а requestLayout() запускает шаги 4, 5 и 6.