Lottie — knihovna s otevřeným zdrojovým kódem od Airbnb, která přehrává vektorovou animaci exportovanou z Adobe After Effects do JSON formátu pomocí pluginu Bodymovin. Animace se vykreslují programově, bez ztráty kvality na jakémkoli rozlišení obrazovky. Podle údajů GitHub (2026) je Lottie používáno ve více než 50 000 projektech na iOS, Android a Web. Více o dalších typech animací si přečtěte v obecném průvodci animacemi.
Hlavní body
Lottie — multiplatformní knihovna pro přehrávání vektorové animace, vyvinutá v Airbnb v roce 2015. Řeší problém těžkých video souborů a rastrových sprite listů: designér vytvoří animaci v After Effects, exportuje ji přes Bodymovin do JSON a vývojář vloží tento soubor do mobilní aplikace. Lottie vykresluje animaci programově pomocí Canvas, Core Animation nebo Skia, v závislosti na platformě.
Hlavní výhoda Lottie — vektorová animace se škáluje bez ztráty kvality na jakékoli obrazovce: od hodinek Apple Watch až po 4K televize. Velikost JSON souboru animace je obvykle 5–50 KB, což je desetkrát méně než ekvivalentní video soubor. Podle Airbnb Engineering (2025) Lottie podporuje více než 80% možností Adobe After Effects, včetně masek, efektů, křivek a výrazů.
Bodymovin — je plugin pro After Effects (zdarma, GitHub), který serializuje kompozici do JSON formátu srozumitelného pro běhové prostředí Lottie. Jsou podporovány verze After Effects CC 2018 a novější. Pro složité animace s velkým počtem klíčových snímků se doporučuje použít dotLottie — formát založený na Lottie JSON, ale komprimovaný a zabalený do jednoho souboru.
Lottie využívá vícevrstvou architekturu vykreslování, která se přizpůsobuje možnostem platformy. Na Androidu se animace kreslí přes Canvas API — vlastní renderer Lottie (LottieDrawable), který nepoužívá systémové animace. Na iOS se Lottie spoléhá na Core Animation Layers, což poskytuje vysoký výkon a 60 FPS. Na Flutteru Lottie používá Skia Canvas přes CustomPainter.
Vykreslování prochází třemi fázemi: parsování JSON — analýza animace v LottieComposition (všechny vrstvy, tvary, klíčové snímky); interpolace — výpočet mezilehlých hodnot mezi klíčovými snímky s ohledem na easing křivky; kreslení — vykreslení aktuálního snímku na Canvas nebo přes Core Animation. Lottie podporuje hardwarovou akceleraci: na Androidu — akcelerace přes Canvas s Hardware Accelerator, na iOS — CALayer s vestavěnou GPU akcelerací Core Animation.
| Platforma | Renderer | Hardwarová akcelerace | Knihovna |
|---|---|---|---|
| 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 | Závisí na platformě | lottie-react-native |
Na Androidu LottieAnimationView rozšiřuje AppCompatImageView a přebírá celý cyklus načítání a vykreslování. JSON soubor je umístěn do složky res/raw nebo assets. LottieAnimationView podporuje správu přehrávání — play, pause, resume, setFrame, setProgress, repeat, speed — a naslouchání přes AnimatorUpdateListener a 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
// Programové nastavení 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()
}
// Načtení z assets a ukládání do mezipaměti
lottieView.setAnimation("animations/confetti.json")
lottieView.setCacheStrategy(LottieAnimationView.CacheStrategy.Strong)
// LottieDrawable — vlastní kreslení bez View
val drawable = LottieDrawable().apply {
setComposition(
LottieCompositionFactory.fromRawRes(context, R.raw.star)
.addListener { composition -> composition?.let { setComposition(it); play() } }
)
}
Nejlepší postupy pro Android: používejte setCacheStrategy(CacheStrategy.Strong) pro často opakované animace — kompozice se ukládá do mezipaměti a každá nová instance neparsuje JSON znovu. Pro seznamy (RecyclerView) používejte LottieAnimationView s enableMergePathsForKitKatAndAbove(true) a disableExtraScaleModeForOlderWorkarounds() pro optimalizaci vykreslování. Pro animace s průhledným pozadím nastavte android:layerType="hardware" pro GPU akceleraci.
Na iOS je AnimationView hlavní třída Lottie pro UIKit a SwiftUI. Připojuje se přes Swift Package Manager nebo CocoaPods. JSON soubory se přidávají do bundle projektu. AnimationView automaticky určuje scale (logickou hustotu obrazovky) a používá Core Animation pro vykreslování vrstev s 60 FPS.
import Lottie
// UIKit: AnimationView s ručním ovládáním
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("Segment animace dokončen: \(finished)")
}
view.addSubview(animationView)
// UIKit: animace s průběhem (pro vázání na událost)
animationView.play(fromFrame: AnimationFrameTime(30),
toFrame: AnimationFrameTime(90))
// SwiftUI: LottieView jako 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
}
}
// Použití ve SwiftUI
LottieView(name: "loading", progress: $animationProgress)
.frame(width: 100, height: 100)
Nejlepší postupy pro iOS: pro animace, které se spouštějí ihned po načtení, používejte animationView.play(fromProgress: 0, toProgress: 1) s loopMode = .playOnce pro jednorázové akcentní efekty. Pro Lottie v UITableView/UICollectionView používejte AnimationView s nacachovaným animačním souborem přes LottieAnimation.cached. Vykreslování velkého počtu vrstev (50+) může způsobit pokles FPS — v takových případech zapněte renderingEngine = .mainThread (výchozí) nebo .coreAnimation pro macOS.
Lottie se zásadně liší od video souborů: neukládá pixely, ale popisuje vektorové tvary, jejich transformace a křivky změn v čase. Video (MP4, WebM) — je sekvence rastrových snímků s pevným rozlišením. Rozdíl se projevuje ve velikosti souboru, kvalitě škálování, interaktivitě a výkonu.
| Parametr | Lottie (JSON) | Video (MP4) | GIF |
|---|---|---|---|
| Velikost souboru | 5–50 KB | 200–2000 KB | 500–5000 KB |
| Kvalita škálování | Vektorová (nekonečná) | Pevná (pixelová) | Pevná |
| Interaktivita | Průběh, rychlost, pauza, změna barvy | Ne | Ne |
| Alfa kanál (průhlednost) | Nativní | Vyžaduje kodek | Podporován |
| Výkon (CPU) | Nízké zatížení | Střední (dekódování) | Vysoké (rastrové dekódování) |
Kdy zvolit Lottie: ikony načítání, like/animace reakcí, úvodní obrazovka, akcentní mikroanimace tlačítek. Pro složité scény s 3D efekty, realistickým osvětlením nebo fotorealistickými postavami zůstává video praktičtější volbou. Lottie není určen pro přehrávání dlouhých scén (více než 10 sekund) — optimální délka jedné animace je 2–5 sekund.
Výkon Lottie závisí na počtu vrstev, složitosti masek a efektů a také na rendereru. Pro udržení 60 FPS na zařízeních střední třídy dodržujte doporučení: omezte počet vrstev na 30–40 na scénu, vyhněte se překrývajícím se vnořeným pre-compositions, používejte dotLottie pro složité animace.
// Optimalizace Lottie pro RecyclerView
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieDrawable
import com.airbnb.lottie.LottieCompositionFactory
// Ukládání kompozice do mezipaměti v paměti
private val cache = LottieCompositionFactory.setCacheStrategy(CacheStrategy.Strong)
// Pool LottieAnimationView pro opětovné použití
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)
}
}
// Vypínání nepotřebných funkcí
lottieView.enableMergePathsForKitKatAndAbove(true)
lottieView.setHardwareAcceleration(true)
lottieView.setMaxFrame(60) // Omezení počtu snímků
Další optimalizace: zapněte enableMergePathsForKitKatAndAbove(true) pro zařízení s Android 4.4+ — to sloučí překrývající se obrysy do jedné cesty, čímž se sníží počet draw calls. Používejte dotLottie místo JSON — binární formát komprimuje animaci o 50–80% díky protobuf serializaci, což zkracuje dobu parsování. Pro animace v RecyclerView nastavte repeatCount = 0 (jednorázové přehrání) a zastavte animaci při rolování pomocí recyclerView.addOnScrollListener. Podle Airbnb Engineering Blog (2025) tato opatření snižují zatížení CPU až o 40%.
Často kladené otázky
Používejte dotLottie — binární formát založený na protobuf, který komprimuje JSON o 50–80%. V After Effects exportujte přes Bodymovin s nastavením «Glyphs» = None (pokud není text potřeba), vypněte extra vodítka a vodicí vrstvy. Odstraňte neviditelné vrstvy a vrstvy s 0% opacity před exportem.
Zkontrolujte minimální verzi SDK: Lottie pro Android podporuje API 14+, ale některé efekty (Path Morphing, Gradient) fungují pouze s API 21+. Na iOS Lottie vyžaduje iOS 11+. Pro stará zařízení použijte fallback — statický PNG snímek z animace. Načítejte animace asynchronně přes LottieCompositionFactory s ošetřením chyb přes LottieListener.onFailure.
Ano, přes LottieDynamicProperties nebo KeyPath. Nastavte Layer Name v After Effects (např. «icon-fill»), poté v kódu: lottieView.addValueCallback(KeyPath(«icon-fill»), LottieProperty.COLOR) { Color.GREEN }. To umožňuje přizpůsobit animaci tématu aplikace bez vytváření duplicitních souborů. Pro iOS použijte AnimationView.setValueProvider(ColorValueProvider).
Lottie — formát pro přehrávání předem vytvořené animace z After Effects. Rive — interaktivní animace se State Machine, triggery a vstupy. Lottie je vhodný pro pasivní animace (načítání, lajky, uvítací obrazovky). Rive — pro hry, interaktivní UI prvky, animace se zpětnou vazbou na akce uživatele. Rive vyžaduje vlastní editor, Lottie funguje přes známý After Effects.
Na Androidu: lottieView.addAnimatorListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { ... } }). Na iOS: animationView.play { finished in }. Ve SwiftUI: použijte Binding pro currentProgress s onChange. Pro Kotlin Multiplatform použijte LottieAnimatable z knihovny lottie-compose.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také