Почему изменять layout во время анимации не рекомендуется

Ответ

Изменение layout во время анимации может привести к неожиданным визуальным артефактам и снижению производительности. При изменении параметров View (например, размеров или позиции) система пересчитывает layout, что прерывает текущую анимацию и вызывает ее перезапуск. Это особенно критично для сложных анимаций или вложенных View.

Вместо этого используйте свойства, не требующие перерасчета layout, например translationX/Y, alpha или scaleX/Y. Они работают на уровне рендеринга и не вызывают перерисовку всей иерархии.

// Плохо - вызывает requestLayout()
view.layoutParams.width = newWidth
view.requestLayout()

// Хорошо - анимирует без перерасчета layout
view.animate().translationX(100f).start()

Ответ 18+ 🔞

Э, слушай, вот реально классическая ситуация, от которой волосы дыбом встают, ёпта. Представь: ты настроил анимацию, красоту наводишь, всё плавненько, а потом — бац! — и у тебя в середине этого действа какой-нибудь requestLayout() выскакивает, как чёрт из табакерки.

Это пиздец что начинается, честно. Визуально — артефакты, всё дергается, будто на старом телевизоре помехи. А по производительности — просто ядрёна вошь! Система, вместо того чтобы красиво двигать твою вьюху, вдруг начинает всю эту матрешку пересчитывать: родителя, соседей, хуй с горы. Анимация на этом месте, естественно, накрывается медным тазом и стартует заново. Выглядит это так, будто её кто-то пинком под зад отправил.

Подозрение ёбать чувствую, что многие так и делают: «О, надо ширину поменять в анимации!» — и лезут в layoutParams. Не, чувак, это путь в никуда, доверия ёбать ноль к такому подходу.

Весь фокус в том, чтобы юзать свойства, которые не трогают лейаут. Это как будто ты не перестраиваешь весь дом, чтобы диван передвинуть, а просто взял и сдвинул его на место. Система рендерит это поверх всего, не пересчитывая всю иерархию. Золотая троица — это translationX/Y (передвинуть), alpha (прозрачность) и scaleX/Y (масштаб). Их и жми.

Вот, смотри, наглядная разница:

// Плохо - вызывает requestLayout(). Это как раз то, от чего всё ебётся.
// Меняешь ширину -> система охуевает и пересчитывает всё с нуля.
view.layoutParams.width = newWidth
view.requestLayout() // Вот он, корень всех зол!

// Хорошо - работает как швейцарские часы.
// Просто говоришь: «Сдвинься на 100 пикселей вправо» — и всё.
view.animate().translationX(100f).start()

Во втором случае система не лезет в дебри лейаута, она просто на лету рисует твою вьюху в новом месте. Гладко, быстро, без лишней ебалы с перерасчетами. Запомни эту простую мысль: хочешь плавную анимацию — не трогай лейаут. Всё остальное — путь в ад с дерганными фреймами и охуевшими от неожиданности пользователями.