Lottie — cos'è, animazione vettoriale nelle app mobili

Autore: IT Sectr Pubblicato: 2026-03-01 Tempo di lettura: 10 min

Lottie — una libreria open source di Airbnb che riproduce animazioni vettoriali esportate da Adobe After Effects in formato JSON tramite il plugin Bodymovin. Le animazioni vengono renderizzate programmaticamente senza perdita di qualità a qualsiasi risoluzione dello schermo. Secondo GitHub (2026), Lottie è utilizzato in oltre 50.000 progetti su iOS, Android e Web. Scopri di più sugli altri tipi di animazione nella guida generale all'animazione.

Punti chiave

  • Lottie — libreria Airbnb per animazione vettoriale JSON da After Effects.
  • Bodymovin — plugin per esportare animazioni da After Effects a JSON.
  • LottieAnimationView — componente View principale per Android (Kotlin/Java).
  • AnimationView — componente UI principale per iOS (Swift, UIKit/SwiftUI).
  • Formato .lottie — contenitore binario compresso, riduce le dimensioni fino all'80%.

Cos'è Lottie?

Lottie — una libreria multipiattaforma per riprodurre animazioni vettoriali, sviluppata in Airbnb nel 2015. Risolve il problema dei file video pesanti e dei fogli sprite raster: un designer crea animazioni in After Effects, le esporta tramite Bodymovin in JSON e uno sviluppatore incorpora questo file in un'app mobile. Lottie renderizza l'animazione programmaticamente tramite Canvas, Core Animation o Skia, a seconda della piattaforma.

Il principale vantaggio di Lottie — l'animazione vettoriale si ridimensiona senza perdita di qualità su qualsiasi schermo: dall'Apple Watch ai televisori 4K. La dimensione del file JSON di animazione è tipicamente di 5–50 KB, decine di volte inferiore a un file video equivalente. Secondo Airbnb Engineering (2025), Lottie supporta oltre l'80% delle funzionalità di Adobe After Effects, inclusi maschere, effetti, curve ed espressioni.

Bodymovin — è un plugin per After Effects (gratuito, GitHub) che serializza una composizione nel formato JSON compreso dal runtime di Lottie. Supporta After Effects CC 2018 e versioni successive. Per animazioni complesse con molti fotogrammi chiave, si consiglia dotLottie — un formato basato su Lottie JSON ma compresso e impacchettato in un unico file.

Architettura di Lottie: come funziona il rendering

Lottie utilizza un'architettura di rendering a livelli che si adatta alle capacità della piattaforma. Su Android, l'animazione viene disegnata tramite l'API Canvas — il renderer proprietario di Lottie (LottieDrawable), che non utilizza le animazioni di sistema. Su iOS, Lottie si basa su Core Animation Layers, offrendo prestazioni elevate e 60 FPS. Su Flutter, Lottie utilizza Skia Canvas tramite CustomPainter.

Il rendering attraversa tre fasi: analisi JSON — scomposizione dell'animazione in LottieComposition (tutti i livelli, forme, fotogrammi chiave); interpolazione — calcolo dei valori intermedi tra fotogrammi chiave considerando le curve di easing; disegno — rendering del fotogramma corrente su Canvas o tramite Core Animation. Lottie supporta l'accelerazione hardware: su Android — accelerazione tramite Canvas con Hardware Accelerator, su iOS — CALayer con accelerazione GPU integrata di Core Animation.

PiattaformaRenderAccelerazione hardwareLibreria
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 bridgeDipende dalla piattaformalottie-react-native

Usare Lottie su Android (Kotlin)

Su Android, LottieAnimationView estende AppCompatImageView e gestisce l'intero ciclo di caricamento e rendering. Il file JSON viene inserito nella cartella res/raw o assets. LottieAnimationView supporta il controllo della riproduzione — play, pause, resume, setFrame, setProgress, repeat, speed — e l'ascolto tramite AnimatorUpdateListener e 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

// Configurazione programmatica di 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()
}

// Caricamento da assets e caching
lottieView.setAnimation("animations/confetti.json")
lottieView.setCacheStrategy(LottieAnimationView.CacheStrategy.Strong)

// LottieDrawable — disegno personalizzato senza View
val drawable = LottieDrawable().apply {
    setComposition(
        LottieCompositionFactory.fromRawRes(context, R.raw.star)
            .addListener { composition -> composition?.let { setComposition(it); play() } }
    )
}

Buone pratiche Android: utilizzare setCacheStrategy(CacheStrategy.Strong) per animazioni ripetute frequentemente — la composizione viene memorizzata nella cache e ogni nuova istanza non analizza JSON nuovamente. Per gli elenchi (RecyclerView), utilizzare LottieAnimationView con enableMergePathsForKitKatAndAbove(true) e disableExtraScaleModeForOlderWorkarounds() per ottimizzare il rendering. Per animazioni con sfondo trasparente, impostare android:layerType="hardware" per l'accelerazione GPU.

Usare Lottie su iOS (Swift)

Su iOS, AnimationView è la classe principale di Lottie per UIKit e SwiftUI. Viene aggiunta tramite Swift Package Manager o CocoaPods. I file JSON vengono aggiunti al bundle del progetto. AnimationView determina automaticamente la scala (densità logica dello schermo) e utilizza Core Animation per rendere i livelli a 60 FPS.

swift
import Lottie

// UIKit: AnimationView con controllo manuale
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: animazione con progresso (per associazione a eventi)
animationView.play(fromFrame: AnimationFrameTime(30),
                    toFrame: AnimationFrameTime(90))
swift
// SwiftUI: LottieView come 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
    }
}

// Utilizzo in SwiftUI
LottieView(name: "loading", progress: $animationProgress)
    .frame(width: 100, height: 100)

Buone pratiche iOS: per animazioni che partono immediatamente dopo il caricamento, utilizzare animationView.play(fromProgress: 0, toProgress: 1) con loopMode = .playOnce per effetti di accento una tantum. Per Lottie in UITableView/UICollectionView, utilizzare AnimationView con un file di animazione memorizzato nella cache tramite LottieAnimation.cached. Il rendering di un numero elevato di livelli (50+) può causare cali di FPS — in tali casi, attivare renderingEngine = .mainThread (predefinito) o .coreAnimation per macOS.

Lottie vs video: confronto tra formati di animazione

Lottie differisce fondamentalmente dai file video: non memorizza pixel, ma descrive forme vettoriali, le loro trasformazioni e curve di variazione nel tempo. Il video (MP4, WebM) è una sequenza di fotogrammi raster a risoluzione fissa. La differenza si manifesta in dimensioni del file, qualità di ridimensionamento, interattività e prestazioni.

ParametroLottie (JSON)Video (MP4)GIF
Dimensione file5–50 KB200–2000 KB500–5000 KB
Qualità di ridimensionamentoVettoriale (infinita)Fissa (pixel)Fissa
InterattivitàAvanzamento, velocità, pausa, cambio coloreNoNo
Canale alfa (trasparenza)NativaRichiede codecSupportata
Prestazioni (CPU)Carico bassoMedio (decodifica)Alto (decodifica raster)

Quando scegliere Lottie: icone di caricamento, animazioni di like/reazioni, schermate di onboarding, microanimazioni di accento dei pulsanti. Per scene complesse con effetti 3D, illuminazione realistica o personaggi fotorealistici, il video rimane una scelta più pratica. Lottie non è progettato per riprodurre scene lunghe (più di 10 secondi) — la durata ottimale di un'animazione è di 2–5 secondi.

Ottimizzazione delle prestazioni di Lottie

Le prestazioni di Lottie dipendono dal numero di livelli, dalla complessità di maschere ed effetti e dal renderer. Per mantenere 60 FPS su dispositivi di fascia media, seguire queste raccomandazioni: limitare il numero di livelli a 30–40 per scena, evitare pre-composizioni annidate sovrapposte, utilizzare dotLottie per animazioni complesse.

kotlin
// Ottimizzazione di Lottie per RecyclerView
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieDrawable
import com.airbnb.lottie.LottieCompositionFactory

// Caching della composizione in memoria
private val cache = LottieCompositionFactory.setCacheStrategy(CacheStrategy.Strong)

// Pool di LottieAnimationView per il riutilizzo
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)
    }
}

// Disattivazione di funzionalità non necessarie
lottieView.enableMergePathsForKitKatAndAbove(true)
lottieView.setHardwareAcceleration(true)
lottieView.setMaxFrame(60) // Limitazione del numero di fotogrammi

Ottimizzazioni aggiuntive: attivare enableMergePathsForKitKatAndAbove(true) per dispositivi con Android 4.4+ — unisce i percorsi sovrapposti in un unico percorso, riducendo il numero di draw call. Utilizzare dotLottie invece di JSON — il formato binario comprime l'animazione del 50–80% tramite serializzazione protobuf, riducendo i tempi di analisi. Per animazioni in RecyclerView, impostare repeatCount = 0 (riproduzione singola) e fermare l'animazione durante lo scorrimento tramite recyclerView.addOnScrollListener. Secondo Airbnb Engineering Blog (2025), queste misure riducono il carico della CPU fino al 40%.

Domande frequenti

Come ridurre la dimensione del JSON di Lottie?

Utilizzare dotLottie — un formato binario basato su protobuf che comprime JSON del 50–80%. In After Effects, esportare tramite Bodymovin con l'impostazione "Glyphs" = None (se il testo non è necessario), disabilitare guide e livelli guida superflui. Rimuovere i livelli invisibili e i livelli con opacità 0% prima dell'esportazione.

Lottie non viene riprodotto su dispositivi vecchi — cosa fare?

Verificare la versione minima dell'SDK: Lottie per Android supporta API 14+, ma alcuni effetti (Path Morphing, Gradient) funzionano solo con API 21+. Su iOS, Lottie richiede iOS 11+. Per dispositivi vecchi, utilizzare un fallback — un fotogramma png statico dell'animazione. Caricare le animazioni in modo asincrono tramite LottieCompositionFactory con gestione degli errori tramite LottieListener.onFailure.

È possibile cambiare i colori in un'animazione Lottie dinamicamente?

Sì, tramite LottieDynamicProperties o KeyPath. Impostare il nome del livello in After Effects (ad esempio, "icon-fill"), quindi nel codice: lottieView.addValueCallback(KeyPath("icon-fill"), LottieProperty.COLOR) { Color.GREEN }. Ciò consente di personalizzare l'animazione in base al tema dell'app senza creare file duplicati. Per iOS, utilizzare AnimationView.setValueProvider(ColorValueProvider).

Lottie vs Rive — qual è la differenza?

Lottie — un formato per riprodurre animazioni predefinite da After Effects. Rive — animazione interattiva con State Machine, trigger e input. Lottie è adatto per animazioni passive (caricamento, like, schermate di benvenuto). Rive è per giochi, elementi UI interattivi, animazioni con feedback alle azioni dell'utente. Rive richiede un proprio editor, Lottie funziona tramite il familiare After Effects.

Come tracciare il completamento di un'animazione Lottie?

Su Android: lottieView.addAnimatorListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { ... } }). Su iOS: animationView.play { finished in }. In SwiftUI: utilizzare Binding per currentProgress con onChange. Per Kotlin Multiplatform, utilizzare LottieAnimatable dalla libreria lottie-compose.

Riepilogo

  • Lottie — libreria Airbnb per riprodurre animazioni vettoriali JSON da After Effects.
  • Bodymovin — plugin di esportazione After Effects → JSON, gratuito, open source.
  • LottieAnimationView (Android) e AnimationView (iOS) — componenti principali per l'incorporamento.
  • Il formato dotLottie (.lottie) riduce le dimensioni del file fino all'80% tramite compressione protobuf.
  • Lottie esegue il rendering tramite Canvas (Android), Core Animation (iOS) o Skia (Flutter) a 60 FPS.
  • La durata ottimale di un'animazione Lottie è di 2–5 secondi, non più di 30–40 livelli per scena.
  • Per animazioni interattive con feedback, utilizzare Rive invece di Lottie.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche