Lottie — ett bibliotek med öppen källkod från Airbnb som spelar upp vektoranimation exporterad från Adobe After Effects till JSON-format via plugin-programmet Bodymovin. Animationer renderas programmatiskt utan kvalitetsförlust på vilken skärmupplösning som helst. Enligt data från GitHub (2026) används Lottie i över 50 000 projekt på iOS, Android och Web. Läs mer om andra typer av animationer i den allmänna animationsguiden.
Huvudpunkter
Lottie — ett plattformsoberoende bibliotek för uppspelning av vektoranimation, utvecklat på Airbnb 2015. Det löser problemet med tunga videofiler och raster-sprite-ark: designern skapar en animation i After Effects, exporterar via Bodymovin till JSON, och utvecklaren bäddar in filen i mobilappen. Lottie renderar animationen programmatiskt via Canvas, Core Animation eller Skia, beroende på plattform.
Den största fördelen med Lottie — vektoranimation skalas utan kvalitetsförlust på alla skärmar: från Apple Watch-klockor till 4K-TV-apparater. Storleken på JSON-animationsfilen är vanligtvis 5–50 KB, vilket är tiotals gånger mindre än en motsvarande videofil. Enligt Airbnb Engineering (2025) stöder Lottie över 80% av Adobe After Effects funktioner, inklusive masker, effekter, kurvor och uttryck.
Bodymovin — är ett plugin för After Effects (gratis, GitHub) som serialiserar kompositionen till JSON-format som är förståeligt för Lotties körning. After Effects CC 2018 och nyare versioner stöds. För komplexa animationer med många nyckelbildrutor rekommenderas att använda dotLottie — ett format baserat på Lottie JSON, men komprimerat och förpackat i en fil.
Lottie använder en skiktad renderingsarkitektur som anpassar sig till plattformens kapacitet. På Android ritas animationen via Canvas API — Lotties egen renderare (LottieDrawable) som inte använder systemanimationer. På iOS förlitar sig Lottie på Core Animation Layers, vilket ger hög prestanda och 60 FPS. På Flutter använder Lottie Skia Canvas via CustomPainter.
Rendering går igenom tre steg: JSON-tolkning — analys av animationen i LottieComposition (alla lager, former, nyckelbilder); interpolering — beräkning av mellanliggande värden mellan nyckelbilder med hänsyn till easing-kurvor; ritning — rendering av den aktuella bilden på Canvas eller via Core Animation. Lottie stöder hårdvaruacceleration: på Android — acceleration via Canvas med Hardware Accelerator, på iOS — CALayer med inbyggd GPU-acceleration av Core Animation.
| Plattform | Renderare | Hårdvaruacceleration | Bibliotek |
|---|---|---|---|
| Android | Canvas (LottieDrawable) | Hardware Accelerator (API 14+) | com.airbnb.lottie |
| iOS | Core Animation (CALayer) | GPU (Metal, OpenGL) | Lottie-iOS |
| Flutter | Skia Canvas (CustomPainter) | Impeller (Flutter 3.16+) | lottie_flutter |
| React Native | Native bridge | Beror på plattform | lottie-react-native |
På Android utökar LottieAnimationView AppCompatImageView och tar över hela laddnings- och renderingscykeln. JSON-filen placeras i mappen res/raw eller assets. LottieAnimationView stöder uppspelningshantering — play, pause, resume, setFrame, setProgress, repeat, speed — och lyssning via AnimatorUpdateListener och AnimatorListener.
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animationView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:lottie_rawRes="@raw/loading_animation"
app:lottie_autoPlay="true"
app:lottie_loop="true" />
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieListener
// Programmatisk konfiguration av LottieAnimationView
val lottieView = LottieAnimationView(context).apply {
setAnimation(R.raw.celebrate_animation)
repeatCount = ValueAnimator.INFINITE
speed = 1.5f
addAnimatorUpdateListener { animator ->
val progress = animator.animatedValue as Float
progressBar.progress = (progress * 100).toInt()
}
playAnimation()
}
// Laddning från assets och cachning
lottieView.setAnimation("animations/confetti.json")
lottieView.setCacheStrategy(LottieAnimationView.CacheStrategy.Strong)
// LottieDrawable — anpassad ritning utan View
val drawable = LottieDrawable().apply {
setComposition(
LottieCompositionFactory.fromRawRes(context, R.raw.star)
.addListener { composition -> composition?.let { setComposition(it); play() } }
)
}
Bästa praxis för Android: använd setCacheStrategy(CacheStrategy.Strong) för ofta upprepade animationer — kompositionen cachas i minnet och varje ny instans tolkar inte JSON på nytt. För listor (RecyclerView) använd LottieAnimationView med enableMergePathsForKitKatAndAbove(true) och disableExtraScaleModeForOlderWorkarounds() för att optimera rendering. För animationer med transparent bakgrund, ställ in android:layerType="hardware" för GPU-acceleration.
På iOS är AnimationView Lotties huvudklass för UIKit och SwiftUI. Den ansluts via Swift Package Manager eller CocoaPods. JSON-filer läggs till i projektets bundle. AnimationView bestämmer automatiskt scale (logisk skärmtäthet) och använder Core Animation för att rendera lager med 60 FPS.
import Lottie
// UIKit: AnimationView med manuell styrning
let animationView = AnimationView(name: "confetti")
animationView.frame = view.bounds
animationView.contentMode = .scaleAspectFit
animationView.loopMode = .loop
animationView.animationSpeed = 1.5
animationView.play(fromProgress: 0, toProgress: 0.5) { finished in
print("Animationssegment slutfört: \(finished)")
}
view.addSubview(animationView)
// UIKit: animation med förlopp (för bindning till händelse)
animationView.play(fromFrame: AnimationFrameTime(30),
toFrame: AnimationFrameTime(90))
// SwiftUI: LottieView som UIViewRepresentable
import Lottie
import SwiftUI
struct LottieView: UIViewRepresentable {
let name: String
var loopMode: LottieLoopMode = .loop
@Binding var progress: CGFloat
func makeUIView(context: Context) -> AnimationView {
let view = AnimationView(name: name)
view.contentMode = .scaleAspectFit
view.loopMode = loopMode
return view
}
func updateUIView(_ uiView: AnimationView, context: Context) {
uiView.currentProgress = progress
}
}
// Användning i SwiftUI
LottieView(name: "loading", progress: $animationProgress)
.frame(width: 100, height: 100)
Bästa praxis för iOS: för animationer som startar direkt efter laddning, använd animationView.play(fromProgress: 0, toProgress: 1) med loopMode = .playOnce för engångseffekter. För Lottie i UITableView/UICollectionView, använd AnimationView med cachad animationsfil via LottieAnimation.cached. Rendering av ett stort antal lager (50+) kan orsaka FPS-fall — i sådana fall, aktivera renderingEngine = .mainThread (standard) eller .coreAnimation för macOS.
Lottie skiljer sig i grunden från videofiler: det lagrar inte pixlar, utan beskriver vectorformer, deras transformationer och förändringskurvor över tid. Video (MP4, WebM) — är en sekvens av rasterbildrutor med fast upplösning. Skillnaden visas i filstorlek, skalningskvalitet, interaktivitet och prestanda.
| Parameter | Lottie (JSON) | Video (MP4) | GIF |
|---|---|---|---|
| Filstorlek | 5–50 KB | 200–2000 KB | 500–5000 KB |
| Skalningskvalitet | Vektor (oändlig) | Fast (pixel) | Fast |
| Interaktivitet | Förlopp, hastighet, paus, färgändring | Nej | Nej |
| Alfakanal (transparens) | Inbyggd | Kräver codec | Stöds |
| Prestanda (CPU) | Låg belastning | Medel (avkodning) | Hög (rasteravkodning) |
När du väljer Lottie: laddningsikoner, gilla-/reaktionsanimationer, onboard-skärm, accentmikroanimationer för knappar. För komplexa scener med 3D-effekter, realistisk belysning eller fotorealistiska karaktärer förblir video ett mer praktiskt val. Lottie är inte avsett för uppspelning av långa scener (över 10 sekunder) — optimal längd för en animation är 2–5 sekunder.
Lotties prestanda beror på antalet lager, komplexiteten hos masker och effekter samt renderaren. För att bibehålla 60 FPS på medelklassenheter, följ rekommendationerna: begränsa antalet lager till 30–40 per scen, undvik överlappande nästlade pre-compositions, använd dotLottie för komplexa animationer.
// Optimera Lottie för RecyclerView
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieDrawable
import com.airbnb.lottie.LottieCompositionFactory
// Cachning av komposition i minnet
private val cache = LottieCompositionFactory.setCacheStrategy(CacheStrategy.Strong)
// Pool av LottieAnimationView för återanvändning
class LottiePool {
private val pool = LinkedList<LottieAnimationView>()
fun acquire(context: Context): LottieAnimationView {
return pool.poll() ?: LottieAnimationView(context)
}
fun release(view: LottieAnimationView) {
view.pauseAnimation()
view.cancelAnimation()
pool.add(view)
}
}
// Inaktivering av onödiga funktioner
lottieView.enableMergePathsForKitKatAndAbove(true)
lottieView.setHardwareAcceleration(true)
lottieView.setMaxFrame(60) // Begränsning av antalet bildrutor
Ytterligare optimeringar: aktivera enableMergePathsForKitKatAndAbove(true) för enheter med Android 4.4+ — detta slår samman överlappande konturer till en bana, vilket minskar antalet draw calls. Använd dotLottie istället för JSON — det binära formatet komprimerar animationen med 50–80% genom protobuf-serialisering, vilket minskar tolkningstiden. För animationer i RecyclerView, ställ in repeatCount = 0 (en gång uppspelning) och stoppa animationen vid scrollning via recyclerView.addOnScrollListener. Enligt Airbnb Engineering Blog (2025) minskar dessa åtgärder CPU-belastningen med upp till 40%.
Vanliga frågor
Använd dotLottie — ett binärt format baserat på protobuf som komprimerar JSON med 50–80%. I After Effects, exportera via Bodymovin med inställningen «Glyphs» = None (om text inte behövs), stäng av extra guider och guidelager. Ta bort osynliga lager och lager med 0% opacity före export.
Kontrollera minsta SDK-version: Lottie för Android stöder API 14+, men vissa effekter (Path Morphing, Gradient) fungerar bara med API 21+. På iOS kräver Lottie iOS 11+. För gamla enheter, använd en fallback — en statisk PNG-bild från animationen. Ladda animationer asynkront via LottieCompositionFactory med felhantering via LottieListener.onFailure.
Ja, via LottieDynamicProperties eller KeyPath. Ställ in Layer Name i After Effects (t.ex. «icon-fill»), sedan i koden: lottieView.addValueCallback(KeyPath(«icon-fill»), LottieProperty.COLOR) { Color.GREEN }. Detta gör att animationen kan anpassas till appens tema utan att skapa dubbletter av filer. För iOS, använd AnimationView.setValueProvider(ColorValueProvider).
Lottie — format för uppspelning av förgjord animation från After Effects. Rive — interaktiv animation med State Machine, triggers och inputs. Lottie passar för passiva animationer (laddning, gilla-markeringar, välkomstskärmar). Rive — för spel, interaktiva UI-element, animationer med återkoppling på användaråtgärder. Rive kräver en egen redigerare, Lottie fungerar via bekanta After Effects.
På Android: lottieView.addAnimatorListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { ... } }). På iOS: animationView.play { finished in }. I SwiftUI: använd Binding för currentProgress med onChange. För Kotlin Multiplatform, använd LottieAnimatable från biblioteket lottie-compose.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också