Spring Animation ist eine Animationstechnik, die das physikalische Verhalten einer Feder simuliert: Masse, Steifigkeit (stiffness), Dämpfung (damping) und Anfangsgeschwindigkeit. Im Gegensatz zu linearen Interpolationen und Bezier-Kurven erzeugt die Federanimation eine natürliche Bewegung mit einem gedämpften Schwingungseffekt, der auf jedem Gerät organisch wirkt. Laut Material Design Guidelines (2026) wird Spring Animation in 73% der animierten Oberflächen der Top-100-App-Store-Apps verwendet. Weitere Informationen zu anderen Animationsarten finden Sie im allgemeinen Animationsleitfaden.
Wichtige Punkte
Spring Animation ist eine Animation, deren Bewegung durch die Gleichung des gedämpften harmonischen Oszillators beschrieben wird. Anstatt einen Wert über eine feste Zeit von 0 auf 1 zu interpolieren, berechnet Spring Animation die Position des Objekts zu jedem Zeitpunkt basierend auf physikalischen Parametern: Masse, Steifigkeit, Dämpfung und Anfangsgeschwindigkeit. Das Ergebnis ist eine natürliche, organische Bewegung, die nicht „mechanisch" wirkt.
Im Gegensatz zu Easing-Kurven (easeIn, easeOut, cubic-bezier), bei denen die Dauer festgelegt und der Pfad vorbestimmt ist, passt sich Spring Animation dynamisch an: Wenn sich der Zielwert während der Animation ändert, berechnet die Feder den Pfad von der aktuellen Position aus sanft neu. Dies ist besonders wichtig für Animationen, die unterbrochen werden können — Drag-to-Dismiss, Pull-to-Refresh, wischbare Karten (swipeable cards).
Laut Apple WWDC 2025 reduziert die Verwendung von Federanimation anstelle fester Kurven die wahrgenommene Latenz um 30–50% dank natürlicher Beschleunigung zu Beginn und sanfter Verlangsamung am Ende. Spring Animation wird für alle bewegungsbezogenen Animationen empfohlen: Verschiebung, Skalierung, Ein-/Ausblendung.
Das Verhalten der Feder wird durch vier Parameter definiert. Stiffness (Steifigkeit) ist die Rückstellkraft ins Gleichgewicht: ein Wert von 100–300 ergibt eine weiche Feder für Listen, 500–1000 eine harte Feder für Schaltflächen und Schalter. Damping (Dämpfung) ist der Bewegungswiderstand: 0 — unendliche Schwingungen, 0.1–0.5 — merkliche gedämpfte Schwingungen (Prell-Effekt), 1 — kritische Dämpfung (keine Schwingungen, sanfte Verlangsamung).
| Parameter | Bereich | Effekt | Anwendungsbeispiel |
|---|---|---|---|
| Stiffness | 100–1000 | Geschwindigkeit der Rückkehr ins Gleichgewicht | 200 = Liste, 600 = Schaltfläche |
| Damping | 0.0–1.0 | Schwingungsdämpfung | 0.3 = Prellen, 1.0 = keine Schwingungen |
| Mass | 0.1–10.0 | Trägheit des Objekts | 1.0 = Standard, 3.0 = schweres Element |
| Initial Velocity | Beliebig | Anfangsgeschwindigkeit in Pixel/s | Fingergeschwindigkeit bei Drag-to-Dismiss |
Kritische Dämpfung (damping = 1.0) ist der optimale Modus für die meisten UI-Animationen: Das Objekt kehrt so schnell wie möglich ohne Überschwingen zur Zielposition zurück. Für den Prell-Effekt (z. B. Pull-to-Refresh) verwenden Sie damping = 0.3–0.5. Für das Einblenden von modalen Fenstern — damping = 0.6–0.8 mit stiffness = 300–500. Die Masse wird selten geändert — der Standardwert von 1.0 funktioniert für fast alle Fälle.
Auf iOS ist Spring Animation über UIView.animate(withDuration:delay:usingSpringWithDamping:initialSpringVelocity:) seit iOS 7 und CASpringAnimation (Core Animation) seit iOS 9 verfügbar. Die UIView-Version ist einfacher und beliebter für das Animieren von View-Eigenschaften (transform, alpha, center). CASpringAnimation ist präziser und bietet Zugriff auf stiffness, damping und mass als separate Eigenschaften.
import UIKit
// UIView.animate mit Federparametern
let originalCenter = view.center
UIView.animate(
withDuration: 0.8,
delay: 0,
usingSpringWithDamping: 0.5,
initialSpringVelocity: 0.3,
options: [.curveEaseInOut, .allowUserInteraction]
) {
view.center = CGPoint(x: originalCenter.x + 100, y: originalCenter.y)
view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
} completion: { _ in
UIView.animate(withDuration: 0.3) {
view.transform = .identity
}
}
// CASpringAnimation — präzise Kontrolle über Parameter
let spring = CASpringAnimation()
spring.keyPath = "transform.scale"
spring.fromValue = 1.0
spring.toValue = 1.5
spring.stiffness = 300
spring.damping = 10
spring.mass = 1.0
spring.initialVelocity = 5.0
"> CASpringAnimation.settlingDuration — berechnete Dauer
spring.duration = spring.settlingDuration
view.layer.add(spring, forKey: "scaleSpring")
CASpringAnimation.settlingDuration ist eine einzigartige Core-Animation-Eigenschaft, die die minimale Animationsdauer berechnet, die die Feder benötigt, um das Gleichgewicht zu erreichen. Das bedeutet, dass Sie die Dauer nicht manuell wählen müssen — das System bestimmt selbst, wie lange die Schwingungsdämpfung dauert. Für UIView.animate wird die Dauer explizit festgelegt, und ein damping von 0.3–0.7 ergibt einen merklichen Prell-Effekt. Für die Integration mit UIPanGestureRecognizer übergeben Sie velocityRecognizer.velocity(in: view) als initialSpringVelocity — so setzt die Animation die Fingerbewegung mit derselben Geschwindigkeit fort.
Auf Android ist SpringAnimation Teil der AndroidX Dynamic Animation Bibliothek (androidx.dynamicanimation). Die Hauptklasse ist SpringAnimation, die jede float-Eigenschaft einer View oder eines benutzerdefinierten Objekts animiert. Parameter werden über SpringForce festgelegt — stiffness (Standard STIFFNESS_MEDIUM = 600) und dampingRatio (Standard DAMPING_RATIO_MEDIUM_BOUNCY = 0.5).
// build.gradle.kts
implementation("androidx.dynamicanimation:dynamicanimation:1.1.0")
// Kotlin: SpringAnimation mit benutzerdefiniertem SpringForce
import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import androidx.dynamicanimation.animation.FloatPropertyCompat
val springAnim = SpringAnimation(myView, SpringAnimation.TRANSLATION_X).apply {
spring = SpringForce().apply {
stiffness = SpringForce.STIFFNESS_LOW // 200.0f
dampingRatio = SpringForce.DAMPING_RATIO_LOW_BOUNCY // 0.2f
finalPosition = 300f
}
start()
}
// SpringAnimation mit Anfangsgeschwindigkeit von Geste
myView.setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
springAnim.cancel()
false
}
MotionEvent.ACTION_UP -> {
val velocity = velocityTracker?.getXVelocity() ?: 0f
SpringAnimation(myView, SpringAnimation.TRANSLATION_X).apply {
spring = SpringForce(0f) "> Rückkehr in die Ausgangsposition
setStartVelocity(velocity)
start()
}
true
}
else -> false
}
}
"> SpringAnimation für eine benutzerdefinierte Eigenschaft
val customAnim = SpringAnimation(
myObject,
object : FloatPropertyCompat<MyClass>("progress") {
override fun getValue(obj: MyClass): Float = obj.progress
override fun setValue(obj: MyClass, value: Float) { obj.progress = value }
}
).apply { start() }
SpringForce-Konstanten: STIFFNESS_LOW (200), STIFFNESS_MEDIUM (600), STIFFNESS_HIGH (1800); DAMPING_RATIO_HIGH_BOUNCY (0.2), DAMPING_RATIO_MEDIUM_BOUNCY (0.5), DAMPING_RATIO_LOW_BOUNCY (0.75), DAMPING_RATIO_NO_BOUNCY (1.0). Für RecyclerView mit Elementanimation verwenden Sie SpringAnimation mit DynamicAnimation.OnAnimationEndListener, um Ressourcen freizugeben. Zum Animieren mehrerer Eigenschaften verwenden Sie SpringAnimation.createFor(view, property).
Jetpack Compose: Ab Compose 1.0 ist Federanimation über Animatable mit spring() verfügbar — animationSpec = spring(dampingRatio = 0.5f, stiffness = 300f). Dies ist der bevorzugte Ansatz für Compose-Projekte, da SpringAnimation aus DynamicAnimation nur mit dem View-System kompatibel ist. Die Compose-Version von spring verwendet die gleiche Physik-Engine, arbeitet aber im Kontext des Compose Animation Systems und pausiert automatisch bei Trennung.
Spring Animation und Easing-Kurven (easeInOut, FastOutSlowIn, decelerate) lösen unterschiedliche Probleme. Easing-Kurven sind mathematisch definierte Pfade mit fester Zeit. Spring ist eine physikalische Simulation, bei der die Zeit von Parametern und Anfangsbedingungen abhängt. Für einfache Ein-/Ausblendanimationen sind Easing-Kurven ausreichend. Für Animationen, die mit Benutzerbewegungen verbunden sind (Drag, Swipe, Scroll), bietet Spring Animation eine natürlichere Reaktion.
| Szenario | Empfehlung | Parameter |
|---|---|---|
| Elementeinblendung | Spring (damping = 0.7, stiffness = 400) | Sanftes Einblenden mit leichtem Überschwingen |
| Swipe-to-dismiss | Spring + Anfangsgeschwindigkeit | setStartVelocity(velocity), damping = 0.5 |
| Icon-Animation | Spring (damping = 0.3, stiffness = 600) | Deutliches Prellen für Akzenteffekte |
| Scroll-Physik | Spring (System) | Nicht anpassen — Android verwaltet selbst |
| Größenänderung | Easing (FastOutSlowIn) | Easing ist zuverlässiger für Layout-Änderungen |
Anti-Patterns: Verwenden Sie Spring Animation nicht zum Animieren von Layout-Parametern (View-Breite/-Höhe über LayoutParams) — dies verursacht eine Hierarchieneuberechnung bei jedem Frame, was zu Ruckeln und FPS-Einbrüchen führt. Für Farbanimationen sind Easing-Kurven ebenfalls vorzuziehen. Für die Animation der Scroll-Position verwenden Sie den systemeigenen Scroller mit Fling — Spring Animation bietet hier keine Vorteile. Für maximale Leistung auf Android begrenzen Sie die Anzahl gleichzeitig aktiver SpringAnimation-Instanzen auf 10–15.
Häufig gestellte Fragen
Stiffness ist die Steifigkeit der Feder (Rückstellkraft). Ein hoher Wert (1000) erzeugt eine schnelle, scharfe Bewegung. Ein niedriger Wert (100) erzeugt eine weiche, langsame Bewegung. Damping ist der Bewegungswiderstand. Ein niedriger Wert (0.2) erzeugt lange Schwingungen mit Prellen. Ein hoher Wert (1.0) erzeugt keine Schwingungen, sanfte Verlangsamung. Stiffness bestimmt die Geschwindigkeit, damping bestimmt das Vorhandensein und die Intensität von Schwingungen.
Beginnen Sie mit damping = 0.5 und stiffness = 400 — dies ist ein universeller Startwert für iOS und Android. Für das Einblenden von Elementen erhöhen Sie damping auf 0.7. Für Akzenteffekte (Gefällt mir, In den Warenkorb) verringern Sie damping auf 0.3 mit stiffness = 600. Für Material Motion verwenden Sie damping = 0.6 und stiffness = 300. Testen Sie die Animation auf einem echten Gerät, nicht in einem Simulator.
Ja, in SwiftUI wird die Federanimation über .animation(.spring(dampingFraction: 0.5, response: 0.5), value: state) oder .spring(blendDuration: 0.3) in withAnimation festgelegt. response und dampingFraction spiegeln stiffness und damping aus UIKit wider. Für interaktive Drag-Animationen verwenden Sie .interactiveSpring() — eine spezielle Version mit gestengesteuerter Anfangsgeschwindigkeit, optimiert für Drag-Animationen.
Überprüfen Sie SpringForce.finalPosition — wenn es nicht gesetzt ist oder dem aktuellen Wert entspricht, kann die Animation möglicherweise nicht starten. Rufen Sie springAnim.cancel() im onPause() der Activity/Fragment auf. Für SpringAnimation in RecyclerView verwenden Sie view.setOnDetachListener { animator.cancel() }. Für Jetpack Compose pausiert SpringAnimation automatisch bei Kompositionsänderungen.
Ja. Rufen Sie auf iOS view.layer.removeAnimation(forKey:) auf — die Animation stoppt am aktuellen Frame. Rufen Sie auf Android springAnim.cancel() auf — das Objekt bleibt an der aktuellen Position. Für einen sanften Übergang zu einem neuen Zielwert aktualisieren Sie finalPosition und rufen cancel nicht auf — SpringAnimation berechnet den Pfad automatisch neu. Für SkipToEnd verwenden Sie springAnim.skipToEnd() auf Android.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch