View Animation è un sistema di animazione legacy di Android API 1+ che lavora con oggetti View attraverso Tween Animation (Alpha, Translate, Scale, Rotate). Google raccomanda Property Animation (Animator) per tutti i nuovi progetti. Questo articolo spiega i principi, i tipi, il markup XML e i motivi dell'abbandono.
Punti Chiave
View Animation è un sottosistema di animazione Android che opera a livello di View (API 1+). Utilizza quattro tipi di Tween Animation: AlphaAnimation (opacità), TranslateAnimation (movimento), ScaleAnimation (scala) e RotateAnimation (rotazione). Ogni animazione è descritta in un file XML nella cartella res/anim/ o creata programmaticamente in codice Kotlin.
Il meccanismo View Animation non modifica le proprietà reali di un View — ridisegna il View in una nuova posizione, scala o opacità, ma il callback onTouchEvent() riceve le coordinate della posizione originale. Questa è una limitazione chiave nota come disallineamento del clic (click mismatch).
Secondo la Documentazione per Sviluppatori Android (2026), Google ha segnato View Animation come API deprecata a partire da Android 3.0 (API 11). Per i nuovi progetti, si raccomanda Property Animation — Animator, AnimatorSet e ObjectAnimator, che lavorano con proprietà reali degli oggetti attraverso metodi setter.
Tween Animation è l'animazione “tra” fotogrammi chiave: si definiscono lo stato iniziale e finale, e il sistema calcola i fotogrammi intermedi. Android fornisce quattro tipi standard, ciascuno con il proprio insieme di parametri.
AlphaAnimation modifica l'opacità di un View da fromAlpha a toAlpha. I valori vanno da 0.0 (completamente trasparente) a 1.0 (completamente visibile). Per impostazione predefinita, l'animazione dura 300 ms. Il parametro fillAfter=true lascia il View nello stato di opacità finale.
<!-- 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 sposta un View dalla posizione iniziale (fromXDelta, fromYDelta) alla posizione finale (toXDelta, toYDelta). I valori sono specificati in pixel, percentuali del genitore o percentuali del View stesso. Ad esempio, 100% significa il 100% della larghezza del View.
ScaleAnimation ridimensiona un View rispetto al punto pivotX/pivotY. fromXScale=1.0, toXScale=2.0 raddoppia la larghezza. Il parametro pivotType determina rispetto a cosa viene calcolato il pivot: self, parent o absolute. L'animazione di scala non modifica le dimensioni reali del View — solo il rendering.
RotateAnimation ruota un View attorno a un punto pivot di un angolo da fromDegrees a toDegrees. L'angolo è misurato in gradi: 0 è la posizione originale, 360 è una rotazione completa. Per una rotazione infinita, usa repeatCount=INFINITE.
La differenza tra View Animation e Property Animation (Animator) è una distinzione fondamentale nell'architettura di animazione Android. View Animation opera solo sul rendering, mentre Property Animation modifica le proprietà reali dell'oggetto attraverso metodi setter, portando ad aggiornamenti del layout.
| Criterio | View Animation | Property Animation |
|---|---|---|
| Livello API | API 1+ (deprecato) | API 11+ (raccomandato) |
| Cosa anima | Rendering del View (canvas) | Proprietà dell'oggetto (setter) |
| Clic dopo animazione | Alla posizione originale | Alla nuova posizione |
| Tipi di animazione | 4 Tween + AnimationSet | ObjectAnimator, ValueAnimator, AnimatorSet |
| LayoutParams | Non modifica | Modifica tramite setLayoutParams |
| Prestazioni | Alte (solo canvas) | Medie (dipende dal setter) |
View Animation è tipicamente definita in file XML in res/anim/ con un elemento radice
<!-- 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>Il file XML viene caricato tramite AnimationUtils.loadAnimation(). L'Interpolator definisce come il parametro cambia nel tempo: accelerate, decelerate, bounce, overshoot. Un Interpolator personalizzato viene creato tramite la risorsa XML @anim/interpolator_name.
Tutte le animazioni Tween supportano gli attributi: duration (ms), startOffset (ritardo prima dell'inizio), repeatCount, repeatMode (restart/reverse), fillEnabled, fillBefore, fillAfter, interpolator. L'attributo fillAfter determina se il View rimane nello stato finale dell'animazione dopo il completamento.
Sebbene le animazioni siano solitamente definite in XML, possono anche essere create programmaticamente usando Kotlin. L'approccio programmatico è utile per parametri dinamici: il valore di opacità dipende dallo stato dell'applicazione anziché essere definito staticamente.
// Creazione programmatica di AlphaAnimation in 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)
}
// Caricamento di un'animazione da XML
val bounceAnim = AnimationUtils.loadAnimation(context, R.anim.bounce)
view.startAnimation(bounceAnim)
// AnimationSet — combinazione di animazioni
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)Il metodo startAnimation() aggiunge l'animazione alla coda di rendering del View. Per annullarla, usa clearAnimation(). Importante: fillAfter=true non modifica LayoutParams — quando startAnimation viene chiamato di nuovo, l'animazione inizia dallo stato originale del View, non dall'ultimo stato renderizzato.
View Animation ha un ambito di applicazione ristretto nel 2026: supporto per Android 4.x (API 16-19) dove Property Animation può funzionare in modo instabile; effetti semplici di apparizione/scomparsa che non richiedono modifiche a LayoutParams; animazioni dove il disallineamento del clic non è critico (ad esempio, elementi di sfondo). Per tutti gli altri casi, Google raccomanda di passare a ObjectAnimator o AnimatorSet.
Secondo Android Developers, Property Animation è 15-20% più efficiente in memoria perché non crea fotogrammi canvas intermedi. Passare da View Animation a Property Animation elimina anche il problema del disallineamento del clic: il View dopo l'animazione riceve i tocchi nella sua nuova posizione.
Domande Frequenti
View Animation modifica solo il rendering del View — dopo l'animazione, il View rimane nella sua posizione originale per gli eventi tattili. Property Animation modifica le proprietà effettive dell'oggetto, aggiornando LayoutParams e gestendo correttamente i clic nella nuova posizione.
Google ha dichiarato View Animation deprecata a partire da Android 3.0 (API 11). Il motivo è il disallineamento del clic (click mismatch) e l'incapacità di animare proprietà arbitrarie degli oggetti. Property Animation risolve questi problemi ed è raccomandata per tutti i nuovi progetti.
Si può usare ma non è raccomandato. Un pulsante dopo TranslateAnimation apparirà in una nuova posizione, ma i clic verranno registrati nella posizione originale. Per i pulsanti, usa Property Animation o un composable con AnimatedVisibility in Jetpack Compose.
Chiama view.clearAnimation(). Se l'animazione è stata avviata con fillAfter=true, il View rimarrà nel suo stato finale. Per forzare il ritorno allo stato originale, chiama clearAnimation() e invalidate().
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche