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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також