View Animation — przestarzały system animacji Android API 1+, działający z obiektami View poprzez Tween Animation (Alpha, Translate, Scale, Rotate). Google zaleca Property Animation (Animator) dla wszystkich nowych projektów. Artykuł wyjaśnia zasady, typy, konfigurację XML i przyczyny rezygnacji.
Najważniejsze
View Animation — podsystem animacji Android, działający na poziomie View (API 1+). Wykorzystuje cztery typy Tween Animation: AlphaAnimation (przezroczystość), TranslateAnimation (przesunięcie), ScaleAnimation (skalowanie) i RotateAnimation (obrót). Każda animacja jest opisana w pliku XML w folderze res/anim/ lub tworzona programowo w kodzie Kotlin.
Mechanizm View Animation nie zmienia rzeczywistych właściwości View — przerysowuje View w nowej pozycji, skali lub przezroczystości, ale wywołanie zwrotne onTouchEvent() przyjmuje współrzędne oryginalnego położenia. To kluczowe ograniczenie, znane jako niezgodność kliknięcia (click mismatch).
Według Android Developer Documentation (2026), Google oznacza View Animation jako przestarzały API, począwszy od Android 3.0 (API 11). Dla nowych projektów zaleca się Property Animation — Animator, AnimatorSet i ObjectAnimator, które działają z rzeczywistymi właściwościami obiektów poprzez metody setter.
Tween Animation — animacja „pomiędzy“ kluczowymi klatkami: określasz stan początkowy i końcowy, a system oblicza klatki pośrednie. Android udostępnia cztery standardowe typy, każdy z własnym zestawem parametrów.
AlphaAnimation zmienia przezroczystość View od fromAlpha do toAlpha. Wartości od 0.0 (całkowicie przezroczyste) do 1.0 (całkowicie widoczne). Domyślnie animacja trwa 300 ms. Parametr fillAfter=true pozostawia View w końcowym stanie przezroczystości.
<!-- 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 przesuwa View z pozycji początkowej (fromXDelta, fromYDelta) do końcowej (toXDelta, toYDelta). Wartości podaje się w pikselach, procentach rodzica lub procentach samego View. Na przykład 100% oznacza 100% szerokości View.
ScaleAnimation skaluje View względem punktu pivotX/pivotY. fromXScale=1.0, toXScale=2.0 zwiększa szerokość dwukrotnie. Parametr pivotType określa, względem czego liczony jest pivot: self, parent lub absolute. Animacja skali nie zmienia rzeczywistych rozmiarów View — tylko renderowanie.
RotateAnimation obraca View wokół punktu pivot o kąt od fromDegrees do toDegrees. Kąt mierzony jest w stopniach: 0 — pozycja wyjściowa, 360 — pełny obrót. Do nieskończonego obrotu użyj repeatCount=INFINITE.
Różnica między View Animation a Property Animation (Animator) — fundamentalna różnica w architekturze animacji Android. View Animation operuje tylko na renderowaniu, Property Animation zmienia rzeczywiste właściwości obiektu poprzez metody setter, co prowadzi do aktualizacji układu.
| Kryterium | View Animation | Property Animation |
|---|---|---|
| Poziom API | API 1+ (przestarzały) | API 11+ (zalecany) |
| Co animuje | Renderowanie View (canvas) | Właściwości obiektu (setter) |
| Kliknięcie po animacji | W oryginalnej pozycji | W nowej pozycji |
| Rodzaje animacji | 4 Tween + AnimationSet | ObjectAnimator, ValueAnimator, AnimatorSet |
| LayoutParams | Nie zmienia | Zmienia przez setLayoutParams |
| Wydajność | Wysoka (tylko canvas) | Średnia (zależy od setter) |
View Animation zwykle definiuje się w plikach XML res/anim/ z elementem głównym
<!-- 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>Plik XML ładuje się przez AnimationUtils.loadAnimation(). Interpolator określa sposób zmiany parametru w czasie: accelerate, decelerate, bounce, overshoot. Niestandardowy Interpolator tworzy się przez zasób XML @anim/interpolator_name.
Wszystkie animacje Tween obsługują atrybuty: duration (ms), startOffset (opóźnienie przed rozpoczęciem), repeatCount, repeatMode (restart/reverse), fillEnabled, fillBefore, fillAfter, interpolator. Atrybut fillAfter określa, czy View pozostaje w końcowym stanie animacji po zakończeniu.
Mimo że animacje są zwykle definiowane w XML, można je tworzyć również programowo przez Kotlin. Podejście programowe jest przydatne dla dynamicznych parametrów: wartość przezroczystości zależy od stanu aplikacji, a nie jest określona statycznie.
// Programistyczne tworzenie AlphaAnimation w Kotlinie
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)
}
// Wczytywanie animacji z XML
val bounceAnim = AnimationUtils.loadAnimation(context, R.anim.bounce)
view.startAnimation(bounceAnim)
// AnimationSet — kombinacja animacji
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)Metoda startAnimation() dodaje animację do kolejki renderowania View. Do anulowania używa się clearAnimation(). Ważne: fillAfter=true nie zmienia LayoutParams — przy ponownym wywołaniu startAnimation animacja zaczyna się od początkowego stanu View, a nie od ostatniego wyrenderowanego.
View Animation ma wąski zakres zastosowania w 2026 roku: obsługa Android 4.x (API 16-19), gdzie Property Animation może działać niestabilnie; proste efekty pojawiania/znikania, które nie wymagają zmiany LayoutParams; animacje, w których niezgodność kliknięcia nie jest krytyczna (na przykład elementy tła). We wszystkich pozostałych przypadkach Google zaleca przejście na ObjectAnimator lub AnimatorSet.
Według Android Developers, Property Animation jest o 15-20% bardziej efektywna pod względem zużycia pamięci, ponieważ nie tworzy pośrednich klatek canvas. Przejście z View Animation na Property Animation eliminuje również problem niezgodności kliknięcia: View po animacji przyjmuje dotknięcia w nowej pozycji.
Często zadawane pytania
View Animation zmienia tylko renderowanie View — po animacji View pozostaje w oryginalnej pozycji dla zdarzeń dotyku. Property Animation zmienia rzeczywiste właściwości obiektu, co aktualizuje LayoutParams i poprawnie obsługuje kliknięcia w nowym położeniu.
Google ogłosiła View Animation jako przestarzałą od Android 3.0 (API 11). Powód — niezgodność kliknięcia (click mismatch) i niemożność animowania dowolnych właściwości obiektów. Property Animation rozwiązuje te problemy i jest zalecana dla wszystkich nowych projektów.
Używać można, ale nie jest zalecane. Przycisk po TranslateAnimation będzie wyświetlany w nowym miejscu, ale kliknięcia będą działać w oryginalnej pozycji. Dla przycisków używaj Property Animation lub komponentu z AnimatedVisibility w Jetpack Compose.
Wywołaj view.clearAnimation(). Jeśli animacja została uruchomiona z fillAfter=true, View pozostanie w stanie końcowym. Aby wymusić powrót do stanu początkowego, wywołaj clearAnimation() i invalidate().
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również