Android Academy · Lezione

Perché le animazioni sono importanti

Movimenti che guidano e coinvolgono gli utenti

Lezione 1 di 413 passaggi

Perché le animazioni sono importanti è una lezione Android Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Android Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Android Academy include 4 lezioni in totale.

Movimento al servizio dell'esperienza

Le animazioni sono più di un semplice ornamento. In una buona app Android, il movimento guida l'attenzione, spiega cosa è cambiato e rende l'interfaccia reattiva e viva.

In questo corso imparerà le API di animazione di Jetpack Compose, dagli helper animate*AsState di una sola riga a AnimatedVisibility, alle transizioni e alle molle basate sulla fisica.

Questa prima lezione riguarda il perché e il quando delle animazioni, così ogni movimento avrà sempre uno scopo.

Compose anima in modo dichiarativo

In Compose non avvia né arresta manualmente le animazioni fotogramma per fotogramma. Descrive invece un valore obiettivo e Compose anima gradualmente verso di esso ogni volta che quel valore cambia.

Qui il colore di un riquadro dipende da un singolo stato booleano. Toccando il riquadro si inverte lo stato e il colore cambia automaticamente in modo graduale.

@Composable
fun ColorBox() {
    var selected by remember { mutableStateOf(false) }
    val color by animateColorAsState(
        targetValue = if (selected) Color.Green else Color.Gray,
        label = "box-color"
    )
    Box(
        Modifier
            .size(120.dp)
            .background(color)
            .clickable { selected = !selected }
    )
}

Feedback per le azioni dell'utente

Uno dei compiti più importanti del movimento è fornire feedback. Quando l'utente tocca un pulsante o attiva un interruttore, una piccola animazione conferma che l'app ha ricevuto l'azione.

I cambiamenti istantanei e bruschi danno una sensazione di malfunzionamento; una transizione rapida di 150-300 ms appare invece curata. Qui un pulsante si riduce leggermente mentre viene premuto.

@Composable
fun PressableButton(onClick: () -> Unit) {
    var pressed by remember { mutableStateOf(false) }
    val scale by animateFloatAsState(
        targetValue = if (pressed) 0.92f else 1f,
        label = "press-scale"
    )
    Button(
        onClick = onClick,
        modifier = Modifier.graphicsLayer {
            scaleX = scale; scaleY = scale
        }
    ) { Text("Tap me") }
}

Spiegare i cambiamenti di stato

Quando l'interfaccia cambia, l'animazione aiuta l'utente a capire cosa è appena successo. Un elemento che appare con una dissolvenza e uno scorrimento comunica "nuovo"; uno che scompare con una dissolvenza comunica "rimosso".

Senza movimento, i contenuti possono comparire o scomparire bruscamente, lasciando l'utente incerto sul fatto che qualcosa sia apparso, scomparso o si sia spostato.

@Composable
fun Banner(visible: Boolean) {
    AnimatedVisibility(
        visible = visible,
        enter = fadeIn() + slideInVertically(),
        exit = fadeOut() + slideOutVertically()
    ) {
        Text("Saved successfully!")
    }
}

Continuità e percezione dello spazio

Il movimento preserva la continuità. Quando una scheda si espande o un elemento si sposta in una nuova posizione, animare il cambiamento aiuta l'utente a mantenere l'orientamento nello spazio.

Compose può animare automaticamente i cambiamenti di layout con Modifier.animateContentSize(), così un riquadro cresce o si riduce gradualmente quando cambia il suo contenuto.

@Composable
fun ExpandableCard(expanded: Boolean) {
    Column(
        Modifier
            .fillMaxWidth()
            .animateContentSize()
            .padding(16.dp)
    ) {
        Text("Title", style = MaterialTheme.typography.titleMedium)
        if (expanded) {
            Text("Here is the longer body that appears when expanded.")
        }
    }
}

Durata e temporizzazione sono importanti

Una buona animazione è rapida. La maggior parte delle transizioni dell'interfaccia dovrebbe durare indicativamente tra 150 ms e 400 ms. Se è troppo lenta, l'app sembra poco reattiva; se è troppo rapida, il movimento diventa impercettibile.

Compose consente di regolare la durata e il ritmo con tween e una curva di easing. L'easing rende il movimento naturale accelerandolo e rallentandolo.

val offset by animateDpAsState(
    targetValue = if (open) 0.dp else 200.dp,
    animationSpec = tween(
        durationMillis = 300,
        easing = FastOutSlowInEasing
    ),
    label = "panel-offset"
)

Non esageri

L'animazione è potente, quindi è facile abusarne. Un eccesso di movimento è distraente, rallenta l'utente e può persino causare disagio.

Regole pratiche:

  • Animi per comunicare, non per decorare.
  • Mantenga le transizioni brevi e discrete.
  • Eviti di animare contemporaneamente ogni elemento sullo schermo.
  • Non impedisca mai all'utente di agire durante un'animazione.

Rispetti l'accessibilità

Alcuni utenti attivano l'opzione Rimuovi animazioni nelle impostazioni di sistema a causa della sensibilità al movimento. Un'app attenta rispetta questa preferenza.

Può verificare se le animazioni sono state impostate su una scala pari a zero e ridurre o disabilitare di conseguenza i movimenti non essenziali.

@Composable
fun rememberReduceMotion(): Boolean {
    val context = LocalContext.current
    val scale = Settings.Global.getFloat(
        context.contentResolver,
        Settings.Global.ANIMATOR_DURATION_SCALE,
        1f
    )
    return scale == 0f
}

La cassetta degli strumenti per le animazioni di Compose

Compose offre un insieme stratificato di API per le animazioni. Le incontrerà nel corso:

  • animate*AsState - anima un singolo valore (colore, dimensione, float).
  • AnimatedVisibility - anima la comparsa e la scomparsa.
  • updateTransition - coordina più valori insieme.
  • AnimatedContent - esegue una dissolvenza incrociata tra contenuti diversi.
  • Animatable e spring - offrono un controllo di basso livello basato sulla fisica.

Inizi dalle API di alto livello e scenda a un livello inferiore solo quando ha bisogno di un controllo maggiore.

L'animazione segue lo stato

Il modello mentale che sblocca tutto: in Compose, le animazioni seguono lo stato. Modifica un valore e un'API di animazione interpola gradualmente l'interfaccia verso il nuovo valore a ogni fotogramma.

Ciò significa che raramente dovrà scrivere una sequenza temporale. Dichiara "questa proprietà deve essere uguale a X" e Compose gestisce per Lei i fotogrammi intermedi.

@Composable
fun FadingText(highlighted: Boolean) {
    val alpha by animateFloatAsState(
        targetValue = if (highlighted) 1f else 0.4f,
        label = "text-alpha"
    )
    Text(
        "Status",
        modifier = Modifier.graphicsLayer { this.alpha = alpha }
    )
}

Un breve ripasso introduttivo del puro Kotlin

Le animazioni interpolano tra i valori. Alla base c'è semplicemente della matematica: una frazione t da 0 a 1 combina un valore iniziale e uno finale. Questa idea (interpolazione lineare, o lerp) è alla base di ogni animazione che scriverà.

Questo breve frammento di puro Kotlin mostra il concetto che Compose applica molte volte al secondo.

fun lerp(start: Float, end: Float, t: Float): Float =
    start + (end - start) * t

fun main() {
    for (i in 0..4) {
        val t = i / 4f
        println("t=$t -> ${lerp(0f, 100f, t)}")
    }
}

Verifica rapida

Qual è il modello mentale alla base delle animazioni in Jetpack Compose?

Riepilogo: movimento con significato

Ora sa perché l'animazione è importante e conosce il modello che la supporta:

  • Il movimento fornisce un riscontro, spiega i cambiamenti e preserva la continuità.
  • Le animazioni di Compose sono dichiarative e seguono lo stato.
  • Mantenga le transizioni brevi (≈150-400ms) e mirate; non esageri.
  • Rispetti gli utenti che riducono il movimento per motivi di accessibilità.
  • Utilizzi innanzitutto le API di alto livello: animate*AsState, AnimatedVisibility, le transizioni e gli spring.

Prossimo argomento: animare singoli valori con la famiglia animate*AsState.

Gratis per iniziare

Impara Kotlin con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
36
Lezioni
152

Domande Frequenti

La lezione «Perché le animazioni sono importanti» è gratuita?

Sì — il testo completo di «Perché le animazioni sono importanti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Android Academy, passa a CoddyKit PRO. Il corso Android Academy include 4 lezioni in totale.

Cosa imparerò in «Perché le animazioni sono importanti»?

Movimenti che guidano e coinvolgono gli utenti Eserciti Android Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Android Academy?

Non è richiesta alcuna esperienza precedente. Android Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Perché le animazioni sono importanti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Android Academy?

Sì. Ogni lezione Android Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché le animazioni sono importanti
  2. Fondamenti di animate*AsState
  3. AnimatedVisibility e transizioni
  4. Animazioni con gesti e molle
← Torna a Android Academy