Уроки по Kotlin в Android Studio для новичков: создание анимации

Плавные переходы, исчезающие надписи и отзывчивые кнопки придают интерфейсу эстетическую привлекательность. Всё это достигается с помощью анимаций, которые можно легко внедрить в проект благодаря встроенным средствам Android Studio. В этом уроке мы изучим, как оживить экран на языке Kotlin: рассмотрим простые методы, которые сразу же дадут ощутимый результат. Никаких сложных вычислений — только готовые инструменты, доступные даже для начинающих разработчиков.


Какие бывают анимации в Android

Система предоставляет несколько способов анимировать элементы. Самый простой — ViewPropertyAnimator, который позволяет менять свойства View: прозрачность, размер, положение, поворот. Чуть больше контроля даёт ObjectAnimator, работающий с любым объектом. Есть ещё анимации перехода между экранами и сложная рисованная анимация, но начинать стоит именно с ViewPropertyAnimator — он покрывает большинство повседневных задач и требует минимум кода.


Подготовка экрана

Создайте новый проект с пустым Activity. В файле activity_main.xml разместите кнопку и текстовую метку. Кнопке задайте id animateButton, тексту — targetText. На кнопке напишите «Запустить анимацию», на метке — любой текст. Интерфейс готов, теперь перейдём в MainActivity.kt и напишем логику.


Плавное исчезновение и появление

ViewPropertyAnimator вызывается напрямую на объекте View. Метод animate() возвращает объект, у которого можно задать нужные свойства и длительность. Например, чтобы плавно скрыть текст, используем alpha(0f). А чтобы вернуть обратно — alpha(1f).

val textView = findViewById<TextView>(R.id.targetText)
val button = findViewById<Button>(R.id.animateButton)

button.setOnClickListener {
    textView.animate()
        .alpha(0f)
        .duration = 500 // полсекунды
}

После выполнения текст станет полностью прозрачным. Чтобы вернуть его, можно добавить второй вызов или настроить повторение.


Перемещение, поворот и масштаб

Тот же метод animate() позволяет двигать элементы, менять их размер и вращать. Вот пример, который сдвигает текст вправо на 200 пикселей, увеличивает его в полтора раза и поворачивает на 360 градусов — всё одновременно.

textView.animate()
    .translationX(200f)
    .scaleX(1.5f)
    .scaleY(1.5f)
    .rotation(360f)
    .setDuration(800)
    .start()

Метод start() в конце не обязателен, но иногда нужен для явного запуска. Все изменения происходят плавно в течение указанного времени.


Анимация с помощью ObjectAnimator

Если нужно анимировать свойство, которого нет у ViewPropertyAnimator, или управлять анимацией более тонко, используем ObjectAnimator. Он привязывается к конкретному объекту и его свойству. Например, изменим у текста размер шрифта (свойство textSize не поддерживается напрямую ViewPropertyAnimator).

val animator = ObjectAnimator.ofFloat(textView, "textSize", 14f, 32f)
animator.duration = 600
animator.start()

Первый параметр — объект, второй — имя свойства (как оно называется в геттере/сеттере), третий и четвёртый — начальное и конечное значения. Можно передать и больше значений для сложной траектории.


Анимация цепочкой: несколько шагов подряд

ViewPropertyAnimator можно объединять в цепочки с помощью withStartAction, withEndAction и слушателей. Например, сделаем так: при нажатии кнопка сначала уменьшается, потом возвращается к исходному размеру с небольшим подскоком.

button.animate()
    .scaleX(0.8f)
    .scaleY(0.8f)
    .setDuration(100)
    .withEndAction {
        button.animate()
            .scaleX(1f)
            .scaleY(1f)
            .setDuration(100)
            .start()
    }
    .start()

Такой приём создаёт эффект нажатия без использования дополнительных библиотек. Пользователь видит, что кнопка «отозвалась» на касание.


Повторяющаяся анимация и бесконечное вращение

Иногда нужно, чтобы анимация зацикливалась — например, индикатор загрузки. Для этого у ObjectAnimator есть режимы повтора. Установим бесконечное вращение текста и автоматический возврат в исходное положение.

val rotateAnim = ObjectAnimator.ofFloat(textView, "rotation", 0f, 360f)
rotateAnim.duration = 1000
rotateAnim.repeatCount = ObjectAnimator.INFINITE
rotateAnim.repeatMode = ObjectAnimator.RESTART
rotateAnim.start()

Чтобы остановить анимацию, вызовите rotateAnim.cancel(). Это пригодится, когда нужно убрать индикатор после завершения загрузки.


Полезные советы

  • Не увлекайтесь длительностью. Анимации дольше 500–800 мс начинают раздражать. Хороший ориентир — 300–500 мс для большинства эффектов.
  • Тестируйте на реальном устройстве. Эмулятор может показывать анимации рывками, тогда как на живом телефоне всё будет гладко.
  • Используйте аппаратное ускорение. По умолчанию анимации на View используют GPU, но если вы рисуете сложную графику, убедитесь, что слой кэшируется через setLayerType.
  • Доступность. Помните, что некоторые пользователи отключают анимации в настройках системы. Проверьте, что приложение остаётся рабочим и без них.

Что мы сегодня освоили

Этот урок в среде Android Studio на языке Kotlin показал, как вдохнуть жизнь в статичные элементы интерфейса. Вы научились плавно менять прозрачность, двигать и вращать текст, анимировать кнопку при нажатии и создавать повторяющиеся эффекты. Полученные навыки помогут сделать ваше приложение более отзывчивым и современным. Попробуйте прямо сейчас добавить анимацию появления для всех элементов на главном экране — это просто, а результат порадует глаз.