View Animation — un sistem de animație învechit Android API 1+, care lucrează cu obiecte View prin Tween Animation (Alpha, Translate, Scale, Rotate). Google recomandă Property Animation (Animator) pentru toate proiectele noi. Articolul explică principiile, tipurile, configurarea XML și motivele renunțării.
Principalele
View Animation — subsistemul de animație Android care funcționează la nivel de View (API 1+). Utilizează patru tipuri de Tween Animation: AlphaAnimation (transparență), TranslateAnimation (deplasare), ScaleAnimation (scalare) și RotateAnimation (rotire). Fiecare animație este descrisă într-un fișier XML în folderul res/anim/ sau creată programatic în codul Kotlin.
Mecanismul View Animation nu modifică proprietățile reale ale View — redesenează View în noua poziție, scară sau transparență, dar apelul onTouchEvent() primește coordonatele locației originale. Aceasta este limitarea cheie, cunoscută ca nepotrivire de clic (click mismatch).
Conform Android Developer Documentation (2026), Google marchează View Animation ca API învechit începând cu Android 3.0 (API 11). Pentru proiecte noi se recomandă Property Animation — Animator, AnimatorSet și ObjectAnimator, care lucrează cu proprietățile reale ale obiectelor prin metode setter.
Tween Animation — animația „între“ cadrele cheie: stabiliți starea inițială și finală, iar sistemul calculează cadrele intermediare. Android oferă patru tipuri standard, fiecare cu propriul set de parametri.
AlphaAnimation modifică transparența View de la fromAlpha la toAlpha. Valorile de la 0.0 (complet transparent) la 1.0 (complet vizibil). În mod implicit, animația durează 300 ms. Parametrul fillAfter=true menține View în starea finală de transparență.
<!-- 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 deplasează View din poziția inițială (fromXDelta, fromYDelta) în poziția finală (toXDelta, toYDelta). Valorile se exprimă în pixeli, procente din părinte sau procente din View însuși. De exemplu, 100% înseamnă 100% din lățimea View.
ScaleAnimation scalează View relativ la punctul pivotX/pivotY. fromXScale=1.0, toXScale=2.0 dublează lățimea. Parametrul pivotType determină relativ la ce se calculează pivotul: self, parent sau absolute. Animația de scalare nu modifică dimensiunile reale ale View — doar randarea.
RotateAnimation rotește View în jurul punctului pivot cu un unghi de la fromDegrees la toDegrees. Unghiul se măsoară în grade: 0 — poziția inițială, 360 — rotație completă. Pentru rotație infinită utilizați repeatCount=INFINITE.
Diferența dintre View Animation și Property Animation (Animator) — o diferență fundamentală în arhitectura animației Android. View Animation operează doar pe randare, Property Animation modifică proprietățile reale ale obiectului prin metode setter, ceea ce duce la actualizarea layout-ului.
| Criteriu | View Animation | Property Animation |
|---|---|---|
| Nivel API | API 1+ (învechit) | API 11+ (recomandat) |
| Ce animează | Randarea View (canvas) | Proprietățile obiectului (setter) |
| Clic după animație | În poziția originală | În noua poziție |
| Tipuri de animații | 4 Tween + AnimationSet | ObjectAnimator, ValueAnimator, AnimatorSet |
| LayoutParams | Nu modifică | Modifică prin setLayoutParams |
| Performanță | Ridicată (doar canvas) | Medie (depinde de setter) |
View Animation se definește de obicei în fișierele XML res/anim/ cu elementul rădăcină
<!-- 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>Fișierul XML se încarcă prin AnimationUtils.loadAnimation(). Interpolatorul determină legea de modificare a parametrului în timp: accelerate, decelerate, bounce, overshoot. Un Interpolator personalizat se creează prin resursa XML @anim/interpolator_name.
Toate animațiile Tween suportă atributele: duration (ms), startOffset (întârziere înainte de start), repeatCount, repeatMode (restart/reverse), fillEnabled, fillBefore, fillAfter, interpolator. Atributul fillAfter determină dacă View rămâne în starea finală a animației după finalizare.
Deși animațiile sunt de obicei definite în XML, ele pot fi create și programatic prin Kotlin. Abordarea programatică este utilă pentru parametrii dinamici: valoarea transparenței depinde de starea aplicației, nu este stabilită static.
// Crearea programatică a AlphaAnimation în 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)
}
// Încărcarea animației din XML
val bounceAnim = AnimationUtils.loadAnimation(context, R.anim.bounce)
view.startAnimation(bounceAnim)
// AnimationSet — combinația animațiilor
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() adaugă animația în coada de randare a View. Pentru anulare se utilizează clearAnimation(). Important: fillAfter=true nu modifică LayoutParams — la reapelarea startAnimation, animația începe din starea inițială a View, nu din ultima stare randată.
View Animation are un domeniu îngust de aplicare în 2026: suport pentru Android 4.x (API 16-19), unde Property Animation poate funcționa instabil; efecte simple de apariție/dispare care nu necesită schimbarea LayoutParams; animații în care nepotrivirea de clic nu este critică (de exemplu, elemente de fundal). Pentru toate celelalte cazuri, Google recomandă trecerea la ObjectAnimator sau AnimatorSet.
Conform Android Developers, Property Animation este cu 15-20% mai eficientă în utilizarea memoriei, deoarece nu creează cadre canvas intermediare. Trecerea de la View Animation la Property Animation elimină și problema nepotrivirii de clic: View după animație primește atingeri în noua poziție.
Întrebări frecvente
View Animation modifică doar randarea View — după animație, View rămâne în poziția originală pentru evenimente de atingere. Property Animation modifică proprietățile reale ale obiectului, ceea ce actualizează LayoutParams și procesează corect clicurile în noua poziție.
Google a declarat View Animation învechită începând cu Android 3.0 (API 11). Motivul — nepotrivirea de clic (click mismatch) și imposibilitatea de a anima proprietăți arbitrare ale obiectelor. Property Animation rezolvă aceste probleme și este recomandată pentru toate proiectele noi.
Se poate utiliza, dar nu este recomandat. Butonul după TranslateAnimation va fi afișat în locul nou, dar clicurile vor funcționa în poziția originală. Pentru butoane, utilizați Property Animation sau componenta cu AnimatedVisibility în Jetpack Compose.
Apelați view.clearAnimation(). Dacă animația a fost pornită cu fillAfter=true, View va rămâne în starea finală. Pentru revenirea forțată la starea inițială, apelați clearAnimation() și invalidate().
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și