View Animation — устаревшая система анимации Android API 1+, работающая с View-объектами через Tween Animation (Alpha, Translate, Scale, Rotate). Google рекомендует Property Animation (Animator) для всех новых проектов. Статья объясняет принципы, типы, XML-разметку и причины отказа.
Главное
View Animation — подсистема анимации Android, работающая на уровне View (API 1+). Она использует четыре типа Tween Animation: AlphaAnimation (прозрачность), TranslateAnimation (перемещение), ScaleAnimation (масштаб) и RotateAnimation (вращение). Каждая анимация описывается в XML-файле в папке res/anim/ или создаётся программно в коде Kotlin.
Механизм View Animation не изменяет реальные свойства View — он перерисовывает View в новом положении, масштабе или прозрачности, но обратный вызов onTouchEvent() принимает координаты исходного расположения. Это ключевое ограничение, известное как клик-несоответствие (click mismatch).
По данным Android Developer Documentation (2026), Google помечает View Animation как устаревший API, начиная с Android 3.0 (API 11). Для новых проектов рекомендуется Property Animation — Animator, AnimatorSet и ObjectAnimator, которые работают с реальными свойствами объектов через setter-методы.
Tween Animation — анимация «между» ключевыми кадрами: вы задаёте начальное и конечное состояние, а система рассчитывает промежуточные кадры. Android предоставляет четыре стандартных типа, каждый со своим набором параметров.
AlphaAnimation изменяет прозрачность View от fromAlpha до toAlpha. Значения от 0.0 (полностью прозрачно) до 1.0 (полностью видимо). По умолчанию анимация длится 300 мс. Параметр fillAfter=true оставляет View в конечном состоянии прозрачности.
<!-- res/anim/fade_out.xml -->
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="500"
android:fillAfter="true" />TranslateAnimation перемещает View из начальной позиции (fromXDelta, fromYDelta) в конечную (toXDelta, toYDelta). Значения задаются в пикселях, процентах от родителя или процентах от самого View. Например, 100% означает 100% ширины View.
ScaleAnimation масштабирует View относительно точки pivotX/pivotY. fromXScale=1.0, toXScale=2.0 увеличивает ширину вдвое. Параметр pivotType определяет, относительно чего считается pivot: self, parent или absolute. Анимация масштаба не меняет реальные размеры View — только отрисовку.
RotateAnimation вращает View вокруг точки pivot на угол от fromDegrees до toDegrees. Угол измеряется в градусах: 0 — исходное положение, 360 — полный оборот. Для бесконечного вращения используйте repeatCount=INFINITE.
Разница между View Animation и Property Animation (Animator) — фундаментальное различие в архитектуре анимации Android. View Animation оперирует только отрисовкой, Property Animation изменяет фактические свойства объекта через setter-методы, что приводит к обновлению макета.
| Критерий | View Animation | Property Animation |
|---|---|---|
| API уровень | API 1+ (устаревший) | API 11+ (рекомендованный) |
| Что анимирует | Отрисовку View (canvas) | Свойства объекта (setter) |
| Клик после анимации | На исходной позиции | На новой позиции |
| Типы анимаций | 4 Tween + AnimationSet | ObjectAnimator, ValueAnimator, AnimatorSet |
| LayoutParams | Не меняет | Меняет через setLayoutParams |
| Производительность | Высокая (только canvas) | Средняя (зависит от setter) |
View Animation обычно задаётся в XML-файлах res/anim/ с корневым элементом
<!-- res/anim/bounce.xml -->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/bounce_interpolator">
<translate
android:fromYDelta="0%"
android:toYDelta="-100%"
android:duration="600" />
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.3"
android:duration="600" />
</set>XML-файл загружается через AnimationUtils.loadAnimation(). Interpolator определяет закон изменения параметра во времени: accelerate, decelerate, bounce, overshoot. Кастомный Interpolator создаётся через XML-ресурс @anim/interpolator_name.
Все Tween-анимации поддерживают атрибуты: duration (мс), startOffset (задержка перед началом), repeatCount, repeatMode (restart/reverse), fillEnabled, fillBefore, fillAfter, interpolator. Атрибут fillAfter определяет, остаётся ли View в конечном состоянии анимации после завершения.
Хотя анимации обычно определяются в XML, их можно создавать и программно через Kotlin. Программный подход полезен для динамических параметров: значение прозрачности зависит от состояния приложения, а не задано статически.
// Программное создание AlphaAnimation в Kotlin
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
import android.view.View
fun View.fadeOut(duration: Long = 500L, onEnd: () -> Unit = {}) {
val animation = AlphaAnimation(1.0f, 0.0f).apply {
this.duration = duration
fillAfter = true
setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationEnd(animation: Animation?) { onEnd() }
override fun onAnimationStart(animation: Animation?) {}
override fun onAnimationRepeat(animation: Animation?) {}
})
}
startAnimation(animation)
}
// Загрузка анимации из XML
val bounceAnim = AnimationUtils.loadAnimation(context, R.anim.bounce)
view.startAnimation(bounceAnim)
// AnimationSet — комбинация анимаций
val set = AnimationSet(true).apply {
addAnimation(TranslateAnimation(0f, 200f, 0f, 0f).apply { duration = 400 })
addAnimation(RotateAnimation(0f, 360f).apply {
duration = 400
pivotX = view.width / 2f
pivotY = view.height / 2f
})
}
view.startAnimation(set)Метод startAnimation() добавляет анимацию в очередь отрисовки View. Для отмены используется clearAnimation(). Важно: fillAfter=true не меняет LayoutParams — при повторном вызове startAnimation анимация начинается с исходного состояния View, а не с последнего отрисованного.
View Animation имеет узкую область применения в 2026 году: поддержка Android 4.x (API 16-19), где Property Animation может работать нестабильно; простые эффекты появления/исчезновения, не требующие смены LayoutParams; анимации, где клик-несоответствие не критично (например, фоновые элементы). Для всех остальных случаев Google рекомендует переходить на ObjectAnimator или AnimatorSet.
По данным Android Developers, Property Animation на 15-20% эффективнее по использованию памяти, так как не создаёт промежуточные canvas-кадры. Переход с View Animation на Property Animation также устраняет проблему click mismatch: View после анимации принимает касания в новом положении.
Часто задаваемые вопросы
View Animation меняет только отрисовку View — после анимации View остаётся на исходной позиции для событий касания. Property Animation изменяет фактические свойства объекта, что обновляет LayoutParams и корректно обрабатывает клики в новом положении.
Google объявила View Animation устаревшей с Android 3.0 (API 11). Причина — клик-несоответствие (click mismatch) и невозможность анимировать произвольные свойства объектов. Property Animation решает эти проблемы и рекомендована для всех новых проектов.
Использовать можно, но не рекомендуется. Кнопка после TranslateAnimation будет отображаться в новом месте, но нажатия будут срабатывать на исходной позиции. Для кнопок используйте Property Animation или композ с AnimatedVisibility в Jetpack Compose.
Вызовите view.clearAnimation(). Если анимация запущена с fillAfter=true, View останется в конечном состоянии. Для принудительного возврата в исходное состояние вызовите clearAnimation() и invalidate().
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также