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 КБ, що в десятки разів менше за еквівалентний відеофайл. За даними 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("Animation segment finished: \(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 vs відео: порівняння форматів анімації

Lottie принципово відрізняється від відеофайлів: він не зберігає пікселі, а описує векторні фігури, їх трансформації та криві зміни в часі. Відео (MP4, WebM) — це послідовність растрових кадрів фіксованої роздільності. Різниця проявляється в розмірі файлу, якості масштабування, інтерактивності та продуктивності.

ПараметрLottie (JSON)Відео (MP4)GIF
Розмір файлу5–50 КБ200–2000 КБ500–5000 КБ
Якість масштабуванняВекторне (нескінченне)Фіксоване (піксельне)Фіксоване
ІнтерактивністьПрогрес, швидкість, пауза, зміна кольоруНемаєНемає
Альфа-канал (прозорість)НативнаПотребує кодекаПідтримується
Продуктивність (CPU)Низьке навантаженняСереднє (декодування)Високе (растрове декодування)

Коли вибирати Lottie: іконки завантаження, лайки/анімації реакцій, онборд-екран, акцентні мікроанімації кнопок. Для складних сцен із 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 vs 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також