AnimatedVisibility in Jetpack Compose – ein- und ausblenden, das nicht springt
Ein Element einfach mit if wegzulassen, poppt hart weg. AnimatedVisibility blendet es weich ein und aus – mit sinnvollen Voreinstellungen und, wenn du willst, deiner eigenen Kombination aus Faden und Bewegung. Ich zeige dir beides.
Der häufigste Weg, in Compose etwas ein- oder auszublenden, ist ein if. Funktioniert – sieht aber ruckartig aus: Das Element ist da, im nächsten Bild ist es weg, alles darunter springt. AnimatedVisibility macht denselben Job weich. Du gibst ihm einen visible-Zustand, es kümmert sich um den Übergang.
Der einfachste Fall
import androidx.compose.animation.AnimatedVisibility
@Composable
fun Hinweis(sichtbar: Boolean) {
AnimatedVisibility(visible = sichtbar) {
// Alles hier drin wird animiert ein-/ausgeblendet.
Text("Gespeichert!")
}
}Mehr braucht es nicht. Die Voreinstellung ist bereits sinnvoll: Beim Erscheinen faded der Inhalt ein und klappt auf, beim Verschwinden faded er aus und klappt zu. Der Platz wird währenddessen sauber mit-animiert – nichts springt.
Eigene Ein- und Ausblendung
Willst du es steuern, übergibst du enter und exit. Übergänge lassen sich mit + kombinieren:
import androidx.compose.animation.*
import androidx.compose.animation.core.tween
AnimatedVisibility(
visible = sichtbar,
enter = fadeIn(tween(250)) + slideInVertically { it / 2 }, // von halber Höhe herein
exit = fadeOut(tween(200)) + shrinkVertically()
) {
Card { Text("Details …") }
}slideInVertically { it / 2 } bekommt die volle Höhe des Inhalts (it) und startet bei der Hälfte – so gleitet die Karte von unten herein, statt einfach aufzupoppen.
Direkt beim ersten Anzeigen animieren
Standardmäßig wird das erste Erscheinen nicht animiert (das Element ist ja schon da, wenn der Screen aufgeht). Willst du auch den Erstauftritt animieren, sag es explizit:
AnimatedVisibility(
visible = sichtbar,
enter = fadeIn(),
exit = fadeOut()
// ab Compose: Parameter je nach Version, z. B. über MutableTransitionState
)Für einen animierten Erstauftritt nutzt du einen MutableTransitionState, den du gleich auf „sichtbar werden" setzt:
val state = remember { MutableTransitionState(false).apply { targetState = true } }
AnimatedVisibility(visibleState = state, enter = fadeIn(), exit = fadeOut()) {
Text("Blende beim Öffnen ein")
}Faustregeln
visiblestattif: Wo du früher ein Element weggelassen hast, wickelst du es inAnimatedVisibility– der Rest bleibt gleich.enter/exitmit+kombinieren:fadeIn() + slideInVertically { … }ist die häufigste Mischung. Faden allein wirkt schnell fad, Bewegung allein hart.- Für Listen anders: Einzelne Einträge in einer
LazyColumnanimierst du nicht mit AnimatedVisibility, sondern mitModifier.animateItem()– sonst kämpfen beide um das Layout. prefers-reduced-motionmitdenken: Wer am System „Bewegung reduzieren" gesetzt hat, sollte kürzere oder gar keine Slides sehen – gute Apps respektieren das.
Wenn du eine Android-App möchtest, die sich flüssig und wertig anfühlt statt ruckartig, schreib mir – genau solche Details baue ich in Kotlin und Jetpack Compose.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
snapshotFlow in Jetpack Compose – aus Compose-Zustand einen Flow machen
Manchmal willst du auf einen Compose-Zustand reagieren wie auf einen Datenstrom – entprellen, kombinieren, sammeln. Genau das macht snapshotFlow. Ich zeige dir das an der häufigsten Aufgabe: mehr laden, wenn der Nutzer ans Listenende scrollt.
ModalBottomSheet in Material 3 – das Blatt, das von unten hereinfährt
Ein Menü, eine Detailansicht, eine Auswahl – auf dem Handy kommt so etwas von unten. Material 3 bringt das fertig mit, inklusive Wischgeste und Verdunkelung. Man muss nur wissen, wie man es richtig schließt.
CompositionLocal – Werte durch den Compose-Baum reichen, ohne sie durchzuschleifen
Wenn ein Wert durch acht Composables durchgereicht wird, nur damit ihn das neunte benutzen kann, ist etwas schief. CompositionLocal löst das – aber nur für eine sehr bestimmte Sorte von Werten.