AnimatedVisibility e transizioni
Animi la visualizzazione e l'occultamento dei contenuti
AnimatedVisibility e transizioni è una lezione Android Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Animare la comparsa
Mostrare e nascondere i contenuti bruscamente può risultare sgradevole. AnimatedVisibility di Compose anima un composable quando entra o esce dal layout.
Inserisca il contenuto al suo interno e controlli la visibilità con un valore booleano. Quando il booleano cambia, Compose riproduce un'animazione di entrata o di uscita invece di mostrare o rimuovere il contenuto istantaneamente.
@Composable
fun Greeting(show: Boolean) {
AnimatedVisibility(visible = show) {
Text("Welcome aboard!")
}
}Transizioni di entrata e di uscita
Può scegliere esattamente come il contenuto entra ed esce utilizzando i parametri enter e exit. Tra i blocchi di costruzione più comuni figurano fadeIn/fadeOut, slideIn/slideOut e expandVertically/shrinkVertically.
Li combini con l'operatore + per eseguirne diversi contemporaneamente.
@Composable
fun Toast(show: Boolean) {
AnimatedVisibility(
visible = show,
enter = fadeIn() + slideInVertically { it },
exit = fadeOut() + slideOutVertically { it }
) {
Text("Item added to cart")
}
}Regolare la specifica della transizione
Ogni transizione di entrata o di uscita accetta un animationSpec, quindi può controllare durata ed easing proprio come con animate*AsState.
Qui il contenuto compare con una dissolvenza nell'arco di 300ms e scompare più rapidamente, in 150ms: un comportamento comune che rende le chiusure immediate e reattive.
AnimatedVisibility(
visible = show,
enter = fadeIn(animationSpec = tween(300)),
exit = fadeOut(animationSpec = tween(150))
) {
Card { Text("Details") }
}Espandere e ridurre
Per le sezioni che mostrano contenuti aggiuntivi, expandVertically e shrinkVertically animano l'altezza, spostando gradualmente il contenuto circostante.
È perfetto per pannelli comprimibili, elementi di FAQ o sezioni "mostra altro".
@Composable
fun Details(expanded: Boolean) {
AnimatedVisibility(
visible = expanded,
enter = expandVertically() + fadeIn(),
exit = shrinkVertically() + fadeOut()
) {
Text("Extra details revealed when expanded.")
}
}updateTransition: uno stato, molti valori
Quando più proprietà devono cambiare insieme in base a un unico stato, updateTransition le coordina. Crea un oggetto Transition i cui elementi figli vengono animati in sincronia.
Definisca lo stato, quindi utilizzi animateColor, animateDp e così via per ogni proprietà in funzione di quello stato.
enum class BoxState { Collapsed, Expanded }
@Composable
fun MorphingBox(state: BoxState) {
val transition = updateTransition(state, label = "box")
val size by transition.animateDp(label = "size") {
if (it == BoxState.Expanded) 200.dp else 100.dp
}
val color by transition.animateColor(label = "color") {
if (it == BoxState.Expanded) Color.Magenta else Color.Cyan
}
Box(Modifier.size(size).background(color))
}Temporizzazione per proprietà in una transizione
Un grande vantaggio di updateTransition è la temporizzazione specifica per ogni proprietà. Ogni elemento figlio animate* può fornire il proprio transitionSpec, così colore e dimensioni possono muoversi a velocità diverse pur restando coordinati dallo stesso stato.
val size by transition.animateDp(
transitionSpec = { tween(durationMillis = 300) },
label = "size"
) { if (it == BoxState.Expanded) 200.dp else 100.dp }
val corner by transition.animateDp(
transitionSpec = { tween(durationMillis = 600) },
label = "corner"
) { if (it == BoxState.Expanded) 0.dp else 24.dp }AnimatedContent: sostituire i contenuti
Quando cambia il contenuto in sé, non solo la sua visibilità, utilizzi AnimatedContent. L'API anima il passaggio dal contenuto precedente a quello nuovo, per impostazione predefinita con una dissolvenza incrociata.
È ideale per elementi come un contatore, un indicatore di avanzamento o il passaggio dallo stato di caricamento a quello caricato.
@Composable
fun Counter(count: Int) {
AnimatedContent(
targetState = count,
label = "counter"
) { value ->
Text("$value", style = MaterialTheme.typography.headlineLarge)
}
}Transizioni personalizzate di AnimatedContent
Personalizzi il modo in cui AnimatedContent sostituisce i contenuti con transitionSpec. Per un contatore, un effetto classico consiste nel far scorrere verso l'alto il nuovo valore mentre quello precedente scorre via, abbinando il tutto a una dissolvenza.
La parola chiave using associa un SizeTransform, in modo che anche il contenitore si ridimensioni gradualmente.
AnimatedContent(
targetState = count,
transitionSpec = {
(slideInVertically { it } + fadeIn()) togetherWith
(slideOutVertically { -it } + fadeOut())
},
label = "counter"
) { value -> Text("$value") }Animare gli elementi di un elenco
All'interno di una LazyColumn, gli elementi aggiunti, rimossi o spostati possono animarsi nella nuova posizione utilizzando Modifier.animateItem() sul contenuto di ciascun elemento.
In questo modo riordinamento e inserimento risultano fluidi senza dover gestire manualmente lo stato.
LazyColumn {
items(tasks, key = { it.id }) { task ->
Text(
task.title,
modifier = Modifier.animateItem()
)
}
}Dissolvenza incrociata per intere schermate
Crossfade è un helper semplice e mirato che applica una dissolvenza tra due stati, ideale per passare da una schermata intera a un'altra o tra stati principali dell'interfaccia.
Gli passi lo stato corrente e una lambda di contenuto; quando lo stato cambia, Crossfade fa scomparire gradualmente il contenuto precedente e comparire quello nuovo.
@Composable
fun ScreenHost(screen: Screen) {
Crossfade(targetState = screen, label = "screen") { current ->
when (current) {
Screen.Home -> HomeScreen()
Screen.Profile -> ProfileScreen()
}
}
}Coordinare gli elementi figli in entrata
All'interno di un blocco AnimatedVisibility è disponibile un AnimatedVisibilityScope, che espone Modifier.animateEnterExit(). Ciò consente ai singoli elementi figli di avere una propria animazione di entrata o di uscita, in aggiunta alla transizione del genitore.
Ad esempio, un pannello può scorrere all'interno mentre il titolo compare con una dissolvenza leggermente ritardata, creando un effetto a più livelli.
AnimatedVisibility(visible = show, enter = slideInVertically()) {
Column {
Text(
"Title",
modifier = Modifier.animateEnterExit(
enter = fadeIn(tween(delayMillis = 100))
)
)
Text("Body")
}
}Verifica rapida
Desidera animare il passaggio dal numero 3 al numero 4, facendo comparire il nuovo valore con una dissolvenza e uno scorrimento. Quale API è più adatta?
Riepilogo: visibilità e transizioni
Ora sa animare la comparsa, la scomparsa e il cambiamento dei contenuti:
AnimatedVisibilityanima entrata e uscita confadeIn/Out,slideIn/Out,expand/shrink, combinabili con+.updateTransitioncoordina molti valori a partire da un unico stato, ciascuno con la propria specifica.AnimatedContentanima il passaggio tra contenuti diversi;Crossfadeè la variante con la semplice dissolvenza.Modifier.animateItem()anima gli inserimenti e il riordinamento degli elementi di un elenco.
Prossimo argomento: gesti e animazioni spring basate sulla fisica per ottenere un movimento naturale e interattivo.
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 «AnimatedVisibility e transizioni» è gratuita?
Sì — il testo completo di «AnimatedVisibility e transizioni» è 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 «AnimatedVisibility e transizioni»?
Animi la visualizzazione e l'occultamento dei contenuti 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 3 di 4.
Quanto tempo richiede la lezione «AnimatedVisibility e transizioni»?
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
- Perché le animazioni sono importanti
- Fondamenti di animate*AsState
- AnimatedVisibility e transizioni
- Animazioni con gesti e molle