Layout Animations: automatische Übergänge ohne manuelles Timing
AI generated
RN
native
React Native · Reanimated · Layout Animations
Layout Animations verstehen
Automatische Übergänge ganz ohne manuelles Timing

Reanimated Layout Animations berechnen flüssige Übergänge automatisch, sobald sich Größe, Position oder Sichtbarkeit einer Komponente ändert, ohne dass Entwickler Start- und Endwerte manuell mit useState oder useEffect orchestrieren müssen. Dieser Artikel zeigt entering, exiting und Layout-Transitions am Beispiel einer Liste mit Hinzufügen- und Entfernen-Animation sowie die Performance-Grenzen bei sehr komplexen Listen.

12 Min. Lesezeit entering/exiting LinearTransition FlatList-Animationen

1. Das Problem mit manuell orchestrierten Übergängen

Ohne Layout Animations muss jeder Übergang, etwa das Entfernen eines Listenelements, manuell choreografiert werden: Erst die Opazität auf null animieren, dann nach Ablauf der Animation das Element tatsächlich aus dem State entfernen, und gleichzeitig dafür sorgen, dass die verbleibenden Elemente sanft nach oben rücken statt abrupt zu springen. Diese Koordination über mehrere useState- und useEffect-Aufrufe ist fehleranfällig und wird mit jeder zusätzlichen Animation komplexer.

Reanimated Layout Animations lösen genau dieses Problem, indem sie Größen- und Positionsänderungen einer Komponente automatisch erkennen und interpolieren, ohne dass der Entwickler Zwischenschritte manuell berechnen muss. Sobald eine Komponente aus dem Baum entfernt, neu eingefügt oder an eine neue Position verschoben wird, übernimmt Reanimated die Animation dieses Übergangs eigenständig.

2. Entering-Animationen: wie neue Elemente erscheinen

Über das entering-Prop einer Animated.View lässt sich festlegen, wie eine Komponente beim ersten Rendern in den sichtbaren Baum eintritt. Vordefinierte Presets wie FadeIn, SlideInRight oder ZoomIn decken die meisten Anwendungsfälle ab und lassen sich über Modifier-Methoden wie .duration() oder .delay() feinjustieren.

Wichtig dabei: Die Entering-Animation greift automatisch bei jedem Mount der Komponente, nicht nur beim ersten Rendern der App. Wird ein Element per bedingtem Rendering neu eingeblendet, etwa nach einem Filterwechsel in einer Liste, spielt Reanimated die Entering-Animation erneut ab, ganz ohne zusätzlichen Code.


import Animated, { FadeIn, SlideInRight } from 'react-native-reanimated';

function NewMessageBubble({ text }: { text: string }) {
  return (
    <Animated.View
      entering={SlideInRight.duration(300).easing(Easing.out(Easing.cubic))}
    >
      <Text>{text}</Text>
    </Animated.View>
  );
}

3. Exiting-Animationen: wie Elemente verschwinden

Das Gegenstück ist das exiting-Prop, das eine Animation definiert, sobald eine Komponente aus dem Baum entfernt wird, etwa FadeOut oder SlideOutLeft. Reanimated hält die Komponente dabei intern noch so lange im nativen View-Baum, bis die Animation abgeschlossen ist, entfernt sie danach aber automatisch, ohne dass der Entwickler ein Timeout oder einen zusätzlichen State pflegen muss.

Das ist der entscheidende Unterschied zu einer manuellen Lösung: Aus React-Sicht ist die Komponente sofort entfernt, sobald sie aus dem Elternbaum verschwindet, während Reanimated auf UI-Thread-Ebene die tatsächliche Entfernung bis zum Ende der Exiting-Animation verzögert.


import Animated, { FadeOut, Layout } from 'react-native-reanimated';

function TodoItem({ item, onRemove }: { item: Todo; onRemove: () => void }) {
  return (
    <Animated.View exiting={FadeOut.duration(250)} layout={Layout.springify()}>
      <TodoRow item={item} onPress={onRemove} />
    </Animated.View>
  );
}

4. Layout-Transitions: automatische Übergänge bei Positionsänderungen

Das layout-Prop, meist mit LinearTransition oder Layout.springify() konfiguriert, sorgt dafür, dass eine Komponente automatisch von ihrer alten zu ihrer neuen Position und Größe animiert, sobald sich das Layout ändert, etwa weil ein Geschwisterelement entfernt wurde oder sich die Größe der Komponente selbst durch neuen Textinhalt ändert.

Reanimated vergleicht dabei intern das Layout vor und nach einer React-Aktualisierung und berechnet automatisch die notwendige Transformation, ohne dass Start- und Zielwerte manuell gemessen werden müssen. Kombiniert mit entering und exiting entsteht so ein vollständiges, konsistentes Übergangssystem für dynamische Listen.

5. Praxisbeispiel: eine Liste mit Hinzufügen- und Entfernen-Animation

Das folgende Beispiel kombiniert alle drei Bausteine in einer einfachen Todo-Liste: Neue Einträge gleiten per entering von rechts ein, entfernte Einträge verblassen per exiting, und alle verbleibenden Einträge rutschen automatisch per layout an ihre neue Position, ganz ohne dass die Liste selbst irgendeine Animationslogik kennt.

Wichtig ist, dass jedes Listenelement einen stabilen key besitzt, meist die ID des jeweiligen Eintrags, weil Reanimated anhand dieses Keys erkennt, ob eine Komponente neu gemountet, unverändert weiterexistiert oder entfernt wurde. Ein instabiler Key, etwa der Array-Index, führt zu falsch zugeordneten Animationen.


function TodoList({ items }: { items: Todo[] }) {
  return (
    <View>
      {items.map((item) => (
        <Animated.View
          key={item.id}
          entering={SlideInRight}
          exiting={FadeOut}
          layout={LinearTransition.springify().damping(18)}
        >
          <TodoRow item={item} />
        </Animated.View>
      ))}
    </View>
  );
}

6. Eigene Transitions statt vordefinierter Presets

Für Fälle, in denen die vordefinierten Presets nicht ausreichen, lassen sich eigene Entering- und Exiting-Animationen als Worklet definieren, das Start- und Endwerte für beliebige Style-Eigenschaften zurückgibt. Das eröffnet die Möglichkeit, mehrere Eigenschaften gleichzeitig zu animieren oder eine Animation an eine spezifische Design-Sprache anzupassen, die von den mitgelieferten Presets nicht abgedeckt wird.

Diese Custom-Animationen laufen ebenso vollständig auf dem UI-Thread wie die vordefinierten Presets, weil auch sie letztlich als Worklets kompiliert werden, was bedeutet, dass sich Performance-Eigenschaften und Fallstricke aus dem Worklet-Modell direkt übertragen.


const CustomEntering = (targetValues: LayoutAnimationsValues) => {
  'worklet';
  const animations = {
    opacity: withTiming(1, { duration: 300 }),
    transform: [{ scale: withSpring(1) }],
  };
  const initialValues = { opacity: 0, transform: [{ scale: 0.8 }] };
  return { initialValues, animations };
};

7. Performance-Grenzen bei komplexen Listen

Bei kurzen bis mittellangen Listen, die vollständig als normale React-Komponenten gerendert werden, funktionieren Layout Animations praktisch ohne Einschränkungen. Bei sehr langen Listen, die über eine virtualisierte FlatList gerendert werden, stoßen entering und exiting jedoch an eine Grenze: Virtualisierte Listen mounten und unmounten Elemente außerhalb des sichtbaren Bereichs ständig, wodurch Reanimated versucht, Animationen für Elemente auszuführen, die der Nutzer nie sieht.

In der Praxis bedeutet das, Layout Animations gezielt nur für sichtbare, kurzfristige Änderungen einzusetzen, etwa das Hinzufügen oder Entfernen eines Eintrags durch eine direkte Nutzeraktion, statt sie pauschal auf jedes Element einer sehr langen, virtualisierten Liste anzuwenden. Bei mehreren hundert gleichzeitig animierten Elementen kann zudem die Anzahl paralleler UI-Thread-Berechnungen selbst auf leistungsstarken Geräten spürbar werden.

8. Layout Animations debuggen und typische Fehlerbilder

Ein häufiges Problem ist, dass eine Layout-Transition gar nicht sichtbar wird, weil die betroffene Komponente nicht direkt eine Animated.View ist, sondern in eine gewöhnliche View verpackt wurde, die selbst kein layout-Prop erhält. Reanimated kann Layout-Änderungen nur für Komponenten animieren, die selbst als Animated-Komponente gerendert werden, nicht für beliebige verschachtelte Kindelemente.

Ein zweites verbreitetes Problem betrifft die neue Architektur: Layout Animations setzen auf Fabric auf und funktionieren auf älteren, noch nicht migrierten App-Teilen mitunter inkonsistent. Ein Test auf beiden Plattformen mit aktivierter neuer Architektur ist deshalb ratsam, bevor Layout Animations produktiv in kritischen Listen eingesetzt werden.

9. Zusammenspiel mit gestengesteuerten Änderungen

Layout Animations lassen sich gut mit gestengesteuerten Interaktionen kombinieren, etwa wenn ein per Swipe-Geste entferntes Listenelement nach Abschluss der Wischbewegung über exiting endgültig ausgeblendet wird, während die verbleibenden Elemente automatisch per layout nachrücken. Die Geste selbst steuert dabei nur die Sichtbarkeit und den State, die eigentliche Übergangsanimation der Liste bleibt vollständig bei Reanimated.

Diese Kombination aus manuell gesteuerten Gesten-Animationen und automatischen Layout Animations ist ein gutes Beispiel dafür, wie sich beide Konzepte ergänzen, statt sich gegenseitig zu ersetzen: Gesten für direkte, physikalisch anmutende Interaktion, Layout Animations für die strukturelle Konsequenz dieser Interaktion.

Situation Empfohlenes Prop Typisches Preset Hinweis
Neues Element erscheint entering FadeIn, SlideInRight Greift bei jedem Mount, nicht nur beim App-Start
Element wird entfernt exiting FadeOut, SlideOutLeft Component bleibt bis Animationsende im nativen Baum
Nachbarelemente rücken nach layout LinearTransition, Layout.springify() Braucht stabilen key pro Element
Sehr lange, virtualisierte Liste Gezielt statt pauschal Kein Preset auf jedes Item FlatList mountet/unmountet außerhalb des Viewports
Eigene, nicht vordefinierte Animation Custom Worklet eigene initialValues/animations Läuft vollständig auf dem UI-Thread
Kombination mit Swipe-Geste exiting nach Gestenende abhängig vom Use-Case Geste steuert State, Layout Animation die Übergänge

Mironsoft

React-Native-App-Entwicklung und Magento-Anbindung

Eine mobile App zum Magento-Shop, die wirklich rund läuft?

Wir entwickeln React-Native-Apps, die sauber an die Magento REST- oder GraphQL-API angebunden sind, von der ersten Codezeile bis zur Veröffentlichung im App Store und bei Google Play.

App-Konzeption

Architektur und Feature-Umfang einer Magento-angebundenen App gemeinsam planen.

Magento-API-Integration

Produktkatalog, Warenkorb und Checkout sauber an die Shop-API anbinden.

Store-Veröffentlichung

App Store- und Google-Play-Freigabeprozess ohne Stolperfallen begleiten.

10. Zusammenfassung

Layout Animations

Kernidee

Reanimated berechnet Übergänge bei Mount, Unmount und Positionsänderung automatisch, ohne manuelles Timing.

Drei Bausteine

entering für neue Elemente, exiting für entfernte Elemente, layout für Positionsänderungen bestehender Elemente.

Wichtige Regel

Jedes Listenelement braucht einen stabilen key, sonst werden Animationen falschen Elementen zugeordnet.

Performance-Grenze

Bei sehr langen virtualisierten Listen gezielt statt pauschal einsetzen, da FlatList ständig mountet und unmountet.

11. FAQ: Layout Animations

1Was ist der Unterschied zwischen entering und layout?
entering steuert, wie eine Komponente beim Mount erscheint, während layout steuert, wie sich eine bereits vorhandene Komponente bewegt, wenn sich ihre Position oder Größe durch eine Änderung im umgebenden Layout ändert.
2Warum wird meine exiting-Animation nicht angezeigt?
Meist weil die Komponente nicht direkt eine Animated.View mit exiting-Prop ist, sondern in eine gewöhnliche View verpackt wurde. Reanimated kann nur Komponenten animieren, die selbst als Animated-Element gerendert werden.
3Muss ich für jedes Listenelement einen stabilen key setzen?
Ja, unbedingt. Reanimated erkennt anhand des keys, ob eine Komponente neu gemountet, weiterexistiert oder entfernt wurde. Ein instabiler Key wie der Array-Index führt zu falsch zugeordneten Animationen.
4Funktionieren Layout Animations auch in einer FlatList?
Grundsätzlich ja, allerdings mit Einschränkungen bei sehr langen Listen, weil Virtualisierung ständig Elemente außerhalb des sichtbaren Bereichs mountet und unmountet, was zu unnötigen Animationsberechnungen führen kann.
5Kann ich eigene Entering- und Exiting-Animationen schreiben?
Ja, über eine Worklet-Funktion, die initialValues und animations zurückgibt. Das erlaubt beliebige Style-Eigenschaften zu animieren, nicht nur die in den vordefinierten Presets abgedeckten.
6Wie kombiniere ich Layout Animations mit einer Swipe-to-Delete-Geste?
Die Geste steuert Sichtbarkeit und State des Elements, während exiting den eigentlichen Ausblende-Übergang übernimmt und layout dafür sorgt, dass verbleibende Elemente automatisch nachrücken.
7Brauchen Layout Animations die neue Architektur?
Sie funktionieren am zuverlässigsten mit Fabric und der neuen Architektur. Auf älteren, noch nicht migrierten App-Teilen kann das Verhalten inkonsistent sein, ein Test auf beiden Plattformen ist deshalb empfehlenswert.
8Was passiert, wenn zwei Listenelemente gleichzeitig entering und exiting nutzen?
Jedes Element animiert unabhängig entsprechend seinem eigenen Zustand, während layout automatisch dafür sorgt, dass sich die verbleibenden Elemente konsistent an die neue Gesamthöhe der Liste anpassen.
9Wie stelle ich die Dauer einer Layout-Transition ein?
Über Modifier-Methoden wie .duration() oder .springify() mit Parametern wie damping und stiffness auf dem jeweiligen Preset, etwa LinearTransition.springify().damping(18).
10Sind Layout Animations bei mehreren hundert gleichzeitig animierten Elementen noch performant?
Nicht uneingeschränkt. Bei sehr vielen gleichzeitig animierten Elementen steigt die Anzahl paralleler UI-Thread-Berechnungen spürbar, weshalb sich ein gezielter statt pauschaler Einsatz auf sichtbare, kurzfristige Änderungen empfiehlt.