Lottie — какво е, векторна анимация в мобилни приложения

Автор: IT Sectr Публикувано: 2026-03-01 Време за четене: 10 мин

Lottie — библиотека с отворен код от Airbnb, която възпроизвежда векторна анимация, експортирана от Adobe After Effects в JSON формат чрез плъгина Bodymovin. Анимациите се рендерират програмно, без загуба на качество на всяка разделителна способност на екрана. Според данни на GitHub (2026), Lottie се използва в повече от 50 000 проекта на iOS, Android и Web. Прочетете повече за други видове анимация в общото ръководство за анимация.

Основни точки

  • Lottie — библиотека на Airbnb за векторна JSON анимация от After Effects.
  • Bodymovin — плъгин за експорт на анимация от After Effects в JSON.
  • LottieAnimationView — основният View компонент за Android (Kotlin/Java).
  • AnimationView — основният UI компонент за iOS (Swift, UIKit/SwiftUI).
  • Форматът .lottie — компресиран двоичен контейнер, намаляващ размера до 80%.

Какво е Lottie?

Lottie — кросплатформена библиотека за възпроизвеждане на векторна анимация, разработена в Airbnb през 2015 г. Тя решава проблема с тежките видеофайлове и растерните спрайт листове: дизайнерът създава анимация в After Effects, експортира чрез Bodymovin в JSON, и разработчикът вгражда този файл в мобилното приложение. Lottie рендерира анимацията програмно чрез Canvas, Core Animation или Skia, в зависимост от платформата.

Основното предимство на Lottie — векторната анимация се мащабира без загуба на качество на всеки екран: от часовниците Apple Watch до 4K телевизорите. Размерът на JSON файла за анимация обикновено е 5–50 KB, което е десетки пъти по-малко от еквивалентен видеофайл. Според Airbnb Engineering (2025), Lottie поддържа над 80% от възможностите на Adobe After Effects, включително маски, ефекти, криви и изрази.

Bodymovin — е плъгин за After Effects (безплатен, GitHub), който сериализира композицията в JSON формат, разбираем за средата за изпълнение на Lottie. Поддържат се версии After Effects CC 2018 и по-нови. За сложни анимации с голям брой ключови кадри се препоръчва използването на dotLottie — формат, базиран на Lottie JSON, но компресиран и опакован в един файл.

Архитектура на Lottie: как работи рендерирането

Lottie използва слоеста архитектура за рендериране, която се адаптира към възможностите на платформата. На Android анимацията се рисува чрез Canvas API — собствен рендерер на Lottie (LottieDrawable), който не използва системни анимации. На iOS Lottie разчита на Core Animation Layers, което осигурява висока производителност и 60 FPS. На Flutter Lottie използва Skia Canvas чрез CustomPainter.

Рендерирането преминава през три етапа: парсване на JSON — анализ на анимацията в LottieComposition (всички слоеве, форми, ключови кадри); интерполация — изчисляване на междинни стойности между ключови кадри, като се вземат предвид easing кривите; рисуване — рендериране на текущия кадър върху Canvas или чрез Core Animation. Lottie поддържа хардуерно ускорение: на Android — ускорение чрез Canvas с Hardware Accelerator, на iOS — CALayer с вградено GPU ускорение на Core Animation.

ПлатформаРендерерХардуерно ускорениеБиблиотека
AndroidCanvas (LottieDrawable)Hardware Accelerator (API 14+)com.airbnb.lottie
iOSCore Animation (CALayer)GPU (Metal, OpenGL)Lottie-iOS
FlutterSkia Canvas (CustomPainter)Impeller (Flutter 3.16+)lottie_flutter
React NativeNative bridgeЗависи от платформатаlottie-react-native

Използване на Lottie на Android (Kotlin)

На Android LottieAnimationView разширява AppCompatImageView и поема целия цикъл на зареждане и рендериране. JSON файлът се поставя в папката res/raw или assets. LottieAnimationView поддържа управление на възпроизвеждането — play, pause, resume, setFrame, setProgress, repeat, speed — и слушане чрез AnimatorUpdateListener и AnimatorListener.

xml

<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" />
kotlin
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieListener

// Програмна настройка на 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()
}

// Зареждане от assets и кеширане
lottieView.setAnimation("animations/confetti.json")
lottieView.setCacheStrategy(LottieAnimationView.CacheStrategy.Strong)

// LottieDrawable — персонализирано рисуване без View
val drawable = LottieDrawable().apply {
    setComposition(
        LottieCompositionFactory.fromRawRes(context, R.raw.star)
            .addListener { composition -> composition?.let { setComposition(it); play() } }
    )
}

Най-добри практики за Android: използвайте setCacheStrategy(CacheStrategy.Strong) за често повтарящи се анимации — композицията се кешира в паметта и всяка нова инстанция не парсва JSON отново. За списъци (RecyclerView) използвайте LottieAnimationView с enableMergePathsForKitKatAndAbove(true) и disableExtraScaleModeForOlderWorkarounds() за оптимизация на рендерирането. За анимации с прозрачен фон задайте android:layerType="hardware" за GPU ускорение.

Използване на Lottie на iOS (Swift)

На iOS AnimationView — основният клас на Lottie за UIKit и SwiftUI. Свързва се чрез Swift Package Manager или CocoaPods. JSON файловете се добавят към bundle-а на проекта. AnimationView автоматично определя scale (логическата плътност на екрана) и използва Core Animation за рендериране на слоеве с 60 FPS.

swift
import Lottie

// UIKit: AnimationView с ръчно управление
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("Сегментът на анимацията завърши: \(finished)")
}
view.addSubview(animationView)

// UIKit: анимация с прогрес (за свързване със събитие)
animationView.play(fromFrame: AnimationFrameTime(30),
                    toFrame: AnimationFrameTime(90))
swift
// SwiftUI: LottieView като 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
    }
}

// Използване в SwiftUI
LottieView(name: "loading", progress: $animationProgress)
    .frame(width: 100, height: 100)

Най-добри практики за iOS: за анимации, които стартират веднага след зареждане, използвайте animationView.play(fromProgress: 0, toProgress: 1) с loopMode = .playOnce за еднократни акцентни ефекти. За Lottie в UITableView/UICollectionView използвайте AnimationView с кеширан анимационен файл чрез LottieAnimation.cached. Рендерирането на голям брой слоеве (50+) може да причини спад на FPS — в такива случаи включете renderingEngine = .mainThread (по подразбиране) или .coreAnimation за macOS.

Lottie срещу видео: сравнение на форматите за анимация

Lottie се различава принципно от видеофайловете: не съхранява пиксели, а описва векторни форми, техните трансформации и криви на промяна във времето. Видеото (MP4, WebM) — е последователност от растерни кадри с фиксирана разделителна способност. Разликата се проявява в размера на файла, качеството на мащабиране, интерактивността и производителността.

ПараметърLottie (JSON)Видео (MP4)GIF
Размер на файла5–50 KB200–2000 KB500–5000 KB
Качество на мащабиранеВекторно (безкрайно)Фиксирано (пикселно)Фиксирано
ИнтерактивностПрогрес, скорост, пауза, смяна на цвятНеНе
Алфа канал (прозрачност)ВграденИзисква кодекПоддържа се
Производителност (CPU)Ниско натоварванеСредно (декодиране)Високо (растерно декодиране)

Кога да изберете Lottie: икони за зареждане, харесвания/анимации на реакции, екран за onboard, акцентни микроанимации на бутони. За сложни сцени с 3D ефекти, реалистично осветление или фотореалистични герои, видеото остава по-практичен избор. Lottie не е предназначен за възпроизвеждане на дълги сцени (повече от 10 секунди) — оптималната продължителност на една анимация е 2–5 секунди.

Оптимизация на производителността на Lottie

Производителността на Lottie зависи от броя на слоевете, сложността на маските и ефектите, както и от рендерера. За поддържане на 60 FPS на устройства от среден клас, следвайте препоръките: ограничете броя на слоевете до 30–40 на сцена, избягвайте припокриващи се вложени pre-compositions, използвайте dotLottie за сложни анимации.

kotlin
// Оптимизация на Lottie за RecyclerView
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieDrawable
import com.airbnb.lottie.LottieCompositionFactory

// Кеширане на композицията в паметта
private val cache = LottieCompositionFactory.setCacheStrategy(CacheStrategy.Strong)

// Пул от LottieAnimationView за повторно използване
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)
    }
}

// Изключване на ненужни функции
lottieView.enableMergePathsForKitKatAndAbove(true)
lottieView.setHardwareAcceleration(true)
lottieView.setMaxFrame(60) // Ограничаване на броя кадри

Допълнителни оптимизации: включете enableMergePathsForKitKatAndAbove(true) за устройства с Android 4.4+ — това обединява припокриващи се контури в един път, намалявайки броя на draw calls. Използвайте dotLottie вместо JSON — двоичният формат компресира анимацията с 50–80% чрез protobuf сериализация, което съкращава времето за парсване. За анимации в RecyclerView задайте repeatCount = 0 (еднократно възпроизвеждане) и спрете анимацията при скролване чрез recyclerView.addOnScrollListener. Според Airbnb Engineering Blog (2025), тези мерки намаляват натоварването на CPU до 40%.

Често задавани въпроси

Как да намалим размера на Lottie JSON?

Използвайте dotLottie — двоичен формат, базиран на protobuf, който компресира JSON с 50–80%. В After Effects експортирайте чрез Bodymovin с настройка «Glyphs» = None (ако текстът не е необходим), изключете допълнителните направляващи и направляващи слоеве. Премахнете невидимите слоеве и слоевете с 0% opacity преди експортиране.

Lottie не се възпроизвежда на стари устройства — какво да правим?

Проверете минималната версия на SDK: Lottie за Android поддържа API 14+, но някои ефекти (Path Morphing, Gradient) работят само с API 21+. На iOS Lottie изисква iOS 11+. За стари устройства използвайте fallback — статичен PNG кадър от анимацията. Зареждайте анимациите асинхронно чрез LottieCompositionFactory с обработка на грешки чрез LottieListener.onFailure.

Могат ли цветовете в Lottie анимация да се променят динамично?

Да, чрез LottieDynamicProperties или KeyPath. Задайте Layer Name в After Effects (например «icon-fill»), след това в кода: lottieView.addValueCallback(KeyPath(«icon-fill»), LottieProperty.COLOR) { Color.GREEN }. Това позволява персонализиране на анимацията според темата на приложението без създаване на дублиращи се файлове. За iOS използвайте AnimationView.setValueProvider(ColorValueProvider).

Lottie срещу Rive — каква е разликата?

Lottie — формат за възпроизвеждане на предварително създадена анимация от After Effects. Rive — интерактивна анимация с State Machine, тригери и входове. Lottie е подходящ за пасивни анимации (зареждане, харесвания, екрани за добре дошли). Rive — за игри, интерактивни UI елементи, анимации с обратна връзка към действията на потребителя. Rive изисква собствен редактор, Lottie работи чрез познатия After Effects.

Как да проследим завършването на Lottie анимация?

На Android: lottieView.addAnimatorListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { ... } }). На iOS: animationView.play { finished in }. В SwiftUI: използвайте Binding за currentProgress с onChange. За Kotlin Multiplatform използвайте LottieAnimatable от библиотеката lottie-compose.

Обобщение

  • Lottie — библиотека на Airbnb за възпроизвеждане на векторна JSON анимация от After Effects.
  • Bodymovin — плъгин за експорт After Effects → JSON, безплатен, с отворен код.
  • LottieAnimationView (Android) и AnimationView (iOS) — основни компоненти за вграждане.
  • Форматът dotLottie (.lottie) намалява размера на файла до 80% чрез protobuf компресия.
  • Lottie се рендерира чрез Canvas (Android), Core Animation (iOS) или Skia (Flutter) с 60 FPS.
  • Оптималната продължителност на Lottie анимация — 2–5 секунди, не повече от 30–40 слоя на сцена.
  • За интерактивни анимации с обратна връзка използвайте Rive, а не Lottie.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също