AnimatedVisibility in Jetpack Compose
Lerne, wie du mit AnimatedVisibility in Jetpack Compose UI-Elemente sanft ein- und ausblendest. So verbesserst du die Nutzererfahrung deiner Android-App.
In modernen Android-Apps erwarten Nutzer weiche, nachvollziehbare Übergänge, wenn sich der Zustand der Benutzeroberfläche ändert. Plötzliches Aufpoppen oder Verschwinden von Elementen wirkt oft irritierend, stört die räumliche Orientierung und bricht den Lesefluss. Genau hier hilft dir Jetpack Compose mit einem speziellen Werkzeug, um Inhalte gezielt und elegant auf den Bildschirm zu bringen oder wieder zu entfernen, wodurch die Bedienung deiner App deutlich flüssiger und professioneller wirkt.
Was ist das?
AnimatedVisibility ist eine fundamentale Composable-Funktion in Jetpack Compose, die primär dafür zuständig ist, das Erscheinen (Enter) und Verschwinden (Exit) ihres Inhalts zu animieren. Anstatt ein Element hart über eine einfache if-Bedingung ein- und auszublenden, interpoliert AnimatedVisibility die visuellen Eigenschaften wie Deckkraft, Größe oder Position über einen kurzen, klar definierten Zeitraum.
Der Kern dieser Funktion liegt darin, Zustandsänderungen für den Nutzer verständlich und nachvollziehbar zu machen. Wenn ein neuer Inhalt relevant wird, etwa ein Hinweisfenster oder ein zusätzliches Eingabefeld, baut sich dieser weich auf, sodass das Auge der Bewegung folgen kann. Wenn der Inhalt nicht mehr gebraucht wird, verschwindet er sanft, ohne das bestehende Layout abrupt zusammenfallen zu lassen. Im Kontext der Jetpack Compose UI gehört AnimatedVisibility zu den wichtigsten Animations-APIs. Sie abstrahiert komplexe Animations-Choreografien stark und macht sie mit minimalem deklarativem Code für dich als Entwickler nutzbar.
Wie funktioniert es?
Das grundlegende Prinzip basiert auf einem simplen Wahrheitswert. Du übergibst der AnimatedVisibility-Funktion einen booleschen visible-Parameter, der zumeist von einem State-Objekt gesteuert wird. Sobald sich dieser Wert von false auf true ändert, wird die festgelegte Enter-Transition ausgelöst und der Inhalt dem UI-Baum hinzugefügt. Wechselt der Wert wieder auf false, startet die Exit-Transition. Der Inhalt bleibt während dieser Zeit noch im UI-Baum sichtbar und reagiert auf die Animation, bevor er nach Abschluss endgültig aus der Hierarchie entfernt wird.
Standardmäßig verwendet Compose eine intelligente Kombination aus Aufblenden (Fade-in) und vertikaler Ausdehnung (Expand) beim Erscheinen, sowie Abblenden (Fade-out) und Schrumpfen (Shrink) beim Verschwinden. Diese Standardwerte passen für viele Alltagssituationen in Android-Apps bereits hervorragend. Du kannst sie jedoch sehr granular steuern. Die API bietet dir dedizierte Parameter für enter und exit, die du mit vordefinierten Funktionen wie fadeIn(), slideInVertically(), scaleIn(), expandVertically() oder deren jeweiligen Pendants für das Verschwinden befüllen kannst. Durch das Überladen des Plus-Operators lassen sich mehrere Effekte sogar nahtlos kombinieren. So erzeugst du beispielsweise ein Aufblenden kombiniert mit einem Hineingleiten von der Seite (fadeIn() + slideInHorizontally()).
Der Lebenszyklus der inneren Elemente ist dabei strikt an die Animation gekoppelt. Das bedeutet für dich, dass du dir keine Sorgen um das Aufräumen von Ressourcen machen musst. Compose hält die Kind-Elemente automatisch solange im Speicher und rendert sie, bis die Exit-Animation vollständig abgeschlossen ist.
In der Praxis
Schauen wir uns an, wie du AnimatedVisibility konkret in deinem Code einsetzt. Stell dir vor, du baust ein Registrierungsformular und möchtest eine Fehlermeldung zur Passwortsicherheit nur dann anzeigen, wenn der Nutzer eine ungültige Eingabe macht.
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@Composable
fun ErrorMessageExample() {
var isErrorVisible by remember { mutableStateOf(false) }
Column {
Button(onClick = { isErrorVisible = !isErrorVisible }) {
Text(if (isErrorVisible) "Fehler verbergen" else "Fehler provozieren")
}
AnimatedVisibility(
visible = isErrorVisible,
enter = fadeIn() + slideInVertically(),
exit = fadeOut() + slideOutVertically()
) {
Text(text = "Dein Passwort muss mindestens 8 Zeichen lang sein.")
}
}
}
In diesem Snippet wird die Fehlermeldung nicht einfach hart gezeichnet oder entfernt. Stattdessen gleitet sie vertikal in den sichtbaren Bereich und blendet sich dabei weich ein. Wenn der Nutzer den Fehler behebt (hier simuliert durch einen erneuten Button-Klick), verschwindet der Text mit der exakt entgegengesetzten Bewegung. Das gibt dem Auge des Nutzers Zeit, die UI-Änderung zu verarbeiten.
Eine typische Stolperfalle bei Anfängern ist das Kombinieren von AnimatedVisibility mit einer regulären if-Anweisung für denselben Zustand. Wenn du die gesamte AnimatedVisibility-Komponente zusätzlich in ein if (isErrorVisible) kapselst, wird die Struktur sofort aus dem Baum entfernt, sobald der Wert auf false wechselt. Compose hat in diesem Fall absolut keine Chance mehr, die Exit-Animation überhaupt zu starten, und das Element verschwindet abrupt. Vertraue stets darauf, dass AnimatedVisibility selbständig dafür sorgt, den Inhalt nach Beendigung der Animation aus dem Rendering-Baum zu nehmen. Steuere das Verhalten daher ausschließlich über den visible-Parameter.
Fazit
AnimatedVisibility ist dein primäres Werkzeug, um das Erscheinen und Verschwinden von UI-Elementen in Jetpack Compose ansprechend zu gestalten. Es wandelt binäre Zustandswechsel in fließende, nutzerfreundliche visuelle Übergänge um und verbessert so die Gesamtqualität deiner Architektur auf der Präsentationsebene. Um den korrekten Umgang zu verinnerlichen, solltest du in deinem aktuellen Projekt prüfen, wo harte Layout-Änderungen auftreten, und diese testweise durch animierte Sichtbarkeitswechsel ersetzen. Verifiziere das Verhalten sorgfältig über den Compose-Preview oder direkt auf einem Emulator. Achte beim Debugging besonders darauf, dass deine States korrekt angebunden sind und die Exit-Animationen reibungslos durchlaufen, ohne durch vorzeitige Bedingungen abgeschnitten zu werden.