View Animation — що це, Tween Animation в Android

Автор: IT Sectr Опубліковано: 2026-03-01 Час читання: 8 хв

View Animation — застаріла система анімації Android API 1+, яка працює з об'єктами View через Tween Animation (Alpha, Translate, Scale, Rotate). Google рекомендує Property Animation (Animator) для всіх нових проєктів. Стаття пояснює принципи, типи, XML-розмітку та причини відмови.

Головне

  • View Animation — анімація View через Tween Animation: Alpha, Translate, Scale, Rotate
  • XML-визначення — анімації описуються в res/anim/ за допомогою , , ,
  • AnimationSet — комбінація кількох анімацій в одному наборі зі спільними параметрами
  • Обмеження — View Animation змінює не властивості, а лише відображення: View залишається на початковій позиції
  • Property Animation — сучасна заміна (Animator), яка працює з реальними властивостями об'єктів

Що таке View Animation?

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

Tween Animation — анімація «між» ключовими кадрами: ви задаєте початковий та кінцевий стан, а система розраховує проміжні кадри. Android надає чотири стандартних типи, кожен зі своїм набором параметрів.

AlphaAnimation

AlphaAnimation змінює прозорість View від fromAlpha до toAlpha. Значення від 0.0 (повністю прозоро) до 1.0 (повністю видимо). За замовчуванням анімація триває 300 мс. Параметр fillAfter=true залишає View у кінцевому стані прозорості.

xml
<!-- 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

TranslateAnimation переміщує View з початкової позиції (fromXDelta, fromYDelta) у кінцеву (toXDelta, toYDelta). Значення задаються в пікселях, відсотках від батька або відсотках від самого View. Наприклад, 100% означає 100% ширини View.

ScaleAnimation

ScaleAnimation масштабує View відносно точки pivotX/pivotY. fromXScale=1.0, toXScale=2.0 збільшує ширину вдвічі. Параметр pivotType визначає, відносно чого обчислюється pivot: self, parent або absolute. Анімація масштабу не змінює реальні розміри View — лише відображення.

RotateAnimation

RotateAnimation обертає View навколо точки pivot на кут від fromDegrees до toDegrees. Кут вимірюється в градусах: 0 — початкове положення, 360 — повний оберт. Для нескінченного обертання використовуйте repeatCount=INFINITE.

View Animation vs Property Animation

Різниця між View Animation та Property Animation (Animator) — фундаментальна відмінність в архітектурі анімації Android. View Animation оперує лише відображенням, Property Animation змінює фактичні властивості об'єкта через setter-методи, що призводить до оновлення макета.

КритерійView AnimationProperty Animation
Рівень APIAPI 1+ (застарілий)API 11+ (рекомендований)
Що анімуєВідображення View (canvas)Властивості об'єкта (setter)
Клік після анімаціїНа початковій позиціїНа новій позиції
Типи анімацій4 Tween + AnimationSetObjectAnimator, ValueAnimator, AnimatorSet
LayoutParamsНе змінюєЗмінює через setLayoutParams
ПродуктивністьВисока (тільки canvas)Середня (залежить від setter)

XML-конфігурація анімацій

View Animation зазвичай задається в XML-файлах res/anim/ з кореневим елементом (AnimationSet) або одним із чотирьох типів. AnimationSet дозволяє комбінувати анімації зі спільними параметрами startOffset, duration, interpolator.

xml
<!-- 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 у кінцевому стані анімації після завершення.

Приклади коду на Kotlin

Хоча анімації зазвичай визначаються в XML, їх можна створювати й програмно через Kotlin. Програмний підхід корисний для динамічних параметрів: значення прозорості залежить від стану застосунку, а не задано статично.

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?

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 відрізняється від Property Animation?

View Animation змінює лише відображення View — після анімації View залишається на початковій позиції для подій дотику. Property Animation змінює фактичні властивості об'єкта, що оновлює LayoutParams і коректно обробляє кліки в новому положенні.

Чому View Animation вважається застарілою?

Google оголосила View Animation застарілою з Android 3.0 (API 11). Причина — клік-невідповідність (click mismatch) і неможливість анімувати довільні властивості об'єктів. Property Animation вирішує ці проблеми і рекомендована для всіх нових проєктів.

Чи можна використовувати View Animation для анімації кнопок?

Використовувати можна, але не рекомендується. Кнопка після TranslateAnimation буде відображатися в новому місці, але натискання спрацьовуватимуть на початковій позиції. Для кнопок використовуйте Property Animation або композ з AnimatedVisibility в Jetpack Compose.

Як скасувати View Animation програмно?

Викличте view.clearAnimation(). Якщо анімацію запущено з fillAfter=true, View залишиться в кінцевому стані. Для примусового повернення в початковий стан викличте clearAnimation() та invalidate().

Підсумки

  • View Animation — застаріла система Tween-анімацій Android із чотирма типами: Alpha, Translate, Scale, Rotate
  • XML-розмітка в res/anim/ з елементами , , , та кореневим
  • AnimationSet об'єднує анімації зі спільним startOffset, duration, interpolator
  • Клік-невідповідність — View після анімації залишається на початковій позиції для подій дотику
  • Property Animation — сучасна заміна через ObjectAnimator, AnimatorSet, що працює з реальними властивостями
  • fillAfter залишає View у кінцевому стані, але не змінює LayoutParams
  • Міграція на Property Animation усуває click mismatch і покращує продуктивність на 15-20%

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також