Salta al contenuto principale
Mobile Guide

Lottie React Native

La nostra guida completa ti insegna a usare lottie react native. Copre i workflow Expo e bare, il controllo delle animazioni, l’ottimizzazione delle performance e le best practice per il 2026.

Lottie React Native

Probabilmente ti trovi in una di queste due situazioni. O hai un designer che ti passa un JSON Lottie e ti chiede: “Riesci a integrarlo nell’app oggi?”, o l’hai già configurato e hai notato che l’animazione funziona in sviluppo, ma diventa pesante una volta che entrano in gioco dispositivi reali, tempi di avvio e build di release.

È qui che Lottie React Native diventa interessante. La demo base è facile. Un’implementazione pronta per la produzione no. La differenza dipende solitamente da come lo installi, come controlli il playback e se consideri i file di animazione come asset innocui o come parte del tuo budget di performance.

Indice dei contenuti

Perché Lottie è essenziale per le app React Native

Se hai mai provato a ricreare a mano un'animazione rifinita in React Native, conosci già il dolore. Piccoli dettagli di movimento si trasformano in un mucchio di logica di timing, interpolazioni e stranezze delle piattaforme. L'animazione può sembrare simile, ma «simile» di solito non è quello che il designer ha consegnato.

Lottie ha cambiato questo workflow. Airbnb ha rilasciato Lottie come open source nel 2016, e quel rilascio ha rivoluzionato le animazioni mobile permettendo ai designer di distribuire le animazioni direttamente, invece di costringere gli ingegneri a ricostruirle frame dopo frame. In alcuni contesti enterprise, questo cambiamento ha ridotto i costi di sviluppo delle app mobile del 40%, secondo i dati di Panoramica di Lottie di Airbnb.

Design e ingegneria smettono di combattere la stessa battaglia

Un vantaggio chiave di Lottie React Native non è solo “animazioni belle in JSON”. È la separazione delle responsabilità. I designer lavorano in After Effects ed esportano con Bodymovin. Gli sviluppatori renderizzano l'output con riproduzione supportata da nativo, invece di tradurre il movimento in code personalizzati.

Questo conta perché il lavoro sulle animazioni tende a diffondersi. Una singola animazione di stato celebrativo può coinvolgere la revisione del design, la revisione del prodotto, il comportamento su Android, il comportamento su iOS, l'accessibilità e le prestazioni di avvio. Lottie riduce quella superficie.

Regola pratica: Usa Lottie quando l'animazione fa parte dell'esperienza del prodotto, non quando ti serve solo una semplice transizione di opacità o translate.

C'è anche un aspetto di user experience. Il movimento dà feedback, conferma le azioni e rende gli stati di caricamento meno statici. Se il tuo team sta pensando seriamente a polish, retention o fiducia nell'interfaccia, l'animazione fa parte di quel discorso. Il dibattito più ampio sulla user experience delle app porta di solito alla stessa conclusione: il feedback rapido batte gli schermi statici.

Dove Lottie dà il meglio

Lottie React Native è ideale per:

  • Micro-interazioni di brand come like, salvataggi, checkmark e stati di successo dell'acquisto
  • Illustrazioni di onboarding che devono sembrare custom senza includere video
  • Stati di caricamento ed empty state dove una UI statica sembra incompleta
  • Spiegazione delle feature quando il prodotto vuole motion senza incorporare GIF o MP4

Non risolve ogni problema di animazione. Per le transizioni di schermata semplici, gli strumenti di animazione di React Native sono spesso più semplici. Per sistemi di motion molto grandi o altamente interattivi, il formato JSON può diventare un trade-off invece di un vantaggio. Questo trade-off diventa più importante in produzione, dove la maggior parte dei tutorial si ferma troppo presto.

Configurare l'ambiente di sviluppo Lottie

Il percorso di installazione dipende prima di tutto da una scelta: Workflow gestito Expo o React Native bare. Non mescolare i modelli mentali. La maggior parte dei problemi di configurazione nasce quando gli sviluppatori seguono una guida per workflow bare all'interno di Expo, o assumono che Expo astragga ogni dettaglio nativo.

Diagramma di flusso con i passaggi per configurare le animazioni Lottie in progetti Expo e Bare React Native.

Scegli il workflow prima di installare

Se la tua app è su Expo e vuoi la configurazione più rapida, resta sul percorso Expo a meno che tu non sappia di aver bisogno di lavoro nativo personalizzato. Se sei in un'app bare, o già dipendi da moduli nativi che richiedono controllo diretto, installala come dipendenza nativa normale e valida immediatamente le build per iOS e Android.

Molti team sottovalutano quanto il debugging diventi più semplice quando mantieni la configurazione allineata al tipo di progetto. È anche per questo che molti team che costruiscono integrazioni native personalizzate confrontano Capgo come alternativa a Expo EAS in anticipo, invece di aspettare che l'app diventi più difficile da modificare.

Setup gestito con Expo

Per le app gestite da Expo, mantienilo al minimo.

  1. Installa il pacchetto

    npx expo install lottie-react-native
  2. Riavvia Metro

    npx expo start -c
  3. Verifica su dispositivo o simulatore Inizia con un file JSON locale e renderizza prima un'animazione molto piccola. Non debuggare un asset pesante e una nuova installazione contemporaneamente.

Alcune note pratiche su Expo:

  • Preferisci prima i file locali: Il debug di animazioni remote aggiunge rumore di rete quando devi solo verificare che la libreria funzioni.
  • Testa subito il comportamento in release: La modalità development può nascondere problemi di timing e performance.
  • Controlla i percorsi degli asset: I file JSON posizionati male sono una delle cause più comuni del “non renderizza nulla”.

Expo è la via più rapida per “funziona”. Non significa che sia la via più rapida per “scalare”.

Configurazione Bare React Native

In un bare project, installa e valida subito le dipendenze native.

  1. Installa il pacchetto

    npm install lottie-react-native
  2. Installa i pod di iOS

    cd ios && pod install && cd ..
  3. Ricompila l'app

    npx react-native run-ios

    oppure

    npx react-native run-android

Ecco la parte che molte guide quick-start saltano: dopo l'installazione, fai un rebuild nativo completo prima di concludere che qualcosa è rotto. L'hot reload non salva una dipendenza nativa che non è stata compilata correttamente nell'app.

Workflow bare che fanno risparmiare tempo

Usa questa breve checklist prima di procedere:

Verifica Perché è importante
Rebuild dopo l'installazione I moduli nativi richiedono una nuova compilazione
Esegui pod install Senza di questo, iOS non sarà affidabile
Inizia con un semplice JSON locale Isola i problemi di installazione da quelli degli asset
Testa entrambe le piattaforme fin da subito Android e iOS possono fallire per motivi diversi

Se il pacchetto si installa correttamente ma la prima animazione non appare, di solito non è un problema di installazione. Spesso si tratta del percorso dell'asset, delle dimensioni del componente o della configurazione del playback.

Visualizza la tua prima animazione Lottie

La prima animazione funzionante deve essere noiosa. File locale. Dimensione fissa. Autoplay attivo. Loop opzionale. Non partire con playback condizionale, JSON remoti o export di animazioni con troppi layer.

Uno workspace moderno con un laptop che mostra code e un monitor con un'app di animazione mobile.

Aggiungi un file di animazione locale

Crea una cartella per gli asset se non ne hai già una:

assets/
  animations/
    success.json

Usa nomi semplici. Evita spazi, punteggiatura strana e cartelle con troppi livelli di annidamento. Vuoi require() percorsi che restano chiari.

Se usi Lottie per una schermata di caricamento iniziale brandizzata o per un handoff dopo il lancio, pensaci bene prima di inserire un'animazione pesante nel percorso di startup. Vale soprattutto se stai anche ottimizzando il tuo Comportamento della splash screen in React Native.

Renderizzala con LottieView

Crea un componente dedicato invece di inserirlo direttamente in un file di una schermata grande:

import React from 'react';
import { View, StyleSheet } from 'react-native';
import LottieView from 'lottie-react-native';

export function SuccessAnimation() {
  return (
    <View style={styles.container}>
      <LottieView
        source={require('../assets/animations/success.json')}
        autoPlay
        loop={false}
        style={styles.animation}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    alignItems: 'center',
    justifyContent: 'center',
  },
  animation: {
    width: 220,
    height: 220,
  },
});

Questo fa tre cose utili:

  • dimostra che la libreria renderizza correttamente
  • dimostra che il percorso dell'asset si risolve correttamente
  • ti dà un unico punto isolato per regolare playback e dimensioni in seguito

Alcune insidie emergono subito se trascuri le basi:

  • Nessuna width o height: L'animazione può esistere ma risultare invisibile.
  • Non valido require() path: Metro non troverà il file.
  • Export non valido: Alcuni file JSON sono tecnicamente validi, ma contengono funzionalità che non si comportano come previsto su mobile.

Mantieni il primo render locale e deterministico. Stai testando l'integrazione, non l'architettura.

Un test migliore per la prima schermata

Inserisci il componente in una schermata semplice con uno sfondo neutro:

import React from 'react';
import { SafeAreaView, StyleSheet } from 'react-native';
import { SuccessAnimation } from './src/SuccessAnimation';

export default function App() {
  return (
    <SafeAreaView style={styles.screen}>
      <SuccessAnimation />
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  screen: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#fff',
  },
});

Se funziona sia sui simulatori iOS che Android, hai superato il primo vero ostacolo. Da qui, il passo successivo non è aggiungere altre animazioni. È imparare quando usare le props dichiarative e quando prendere il controllo diretto con i ref.

Padroneggiare i controlli delle animazioni Lottie

La maggior parte dei bug di Lottie React Native emerge quando l'animazione deve reagire allo stato. L'autoplay è facile. "Riproduci questo segmento quando l'utente mette like a un elemento, inverti la riproduzione quando toglie il like e non creare scatti quando il componente esegue il re-render": è qui che le cose si complicano.

Una tabella comparativa che spiega i metodi di controllo delle animazioni dichiarativi e imperativi in Lottie, evidenziandone i casi d'uso specifici.

Usa le props quando la riproduzione è semplice

Per la riproduzione non interattiva, le props bastano.

<LottieView
  source={require('../assets/animations/loading.json')}
  autoPlay
  loop
  speed={1}
/>

Questo stile è adatto a:

  • indicatori di caricamento
  • illustrazioni passive per l'onboarding
  • stati vuoti decorativi

È dichiarativo e leggibile. Il componente si monta, la riproduzione parte e React mantiene il controllo. Se la logica dell'animazione può essere descritta interamente tramite le props, tienila lì.

Un caso dichiarativo più avanzato è progress, dove si lega il frame dell'animazione a un altro valore. Funziona bene quando il movimento deve riflettere una fonte di progresso esterna, ma è meno comodo per eventi di trigger una tantum.

Ecco un rapido confronto visivo prima di passare ai ref:

Usa i ref quando lo stato guida l'animazione

Quando l'utente tocca, alterna o completa un'azione, un ref è generalmente lo strumento più sicuro. I dati reali mostrano che Il 68% degli sviluppatori che usano framework ibridi segnala trigger di animazione falliti a causa di una gestione errata dei ref negli useEffect hook, motivo per cui i pattern affidabili basati su animation.current.play() sono fondamentali, come evidenziato in questa discussione focalizzata su Capacitor e sui trigger falliti.

Il problema non riguarda solo le app ibride. Si presenta anche in React Native puro, specialmente quando i dev ricreano i ref, avviano il playback prima del mount o legano le chiamate delle animazioni a effect instabili.

import React, { useRef, useState } from 'react';
import { Pressable } from 'react-native';
import LottieView from 'lottie-react-native';

export function LikeButton() {
  const animationRef = useRef<LottieView>(null);
  const [liked, setLiked] = useState(false);

  const onPress = () => {
    if (!animationRef.current) return;

    if (liked) {
      animationRef.current.play(60, 0);
    } else {
      animationRef.current.play(0, 60);
    }

    setLiked(!liked);
  };

  return (
    <Pressable onPress={onPress}>
      <LottieView
        ref={animationRef}
        source={require('../assets/animations/like.json')}
        loop={false}
        autoPlay={false}
        style={{ width: 96, height: 96 }}
      />
    </Pressable>
  );
}

Un pattern affidabile per like e unlike

Questo pattern regge meglio in produzione rispetto a chiamare play() dentro useEffect a ogni cambio di stato.

Perché funziona:

  • L'evento gestisce il trigger dell'animazione: Un evento di pressione è un momento stabile per avviare la riproduzione.
  • Il ref resta locale e persistente: useRef evita rerender non necessari.
  • Il componente evita conflitti di autoplay: Non vuoi che il comportamento di mount interferisca con quello attivato dall'utente.

Errori comuni da evitare:

  1. Attivare prima che il ref esista
    Se animationRef.current è null, la riproduzione non avverrà. Proteggilo.

  2. Usare autoPlay con controlli imperativi
    Scegli un owner predefinito per la riproduzione.

  3. Gestire tutto tramite useEffect
    Gli Effects sono utili, ma per le azioni UI spesso introducono problemi di timing invece di eliminarli.

Se un'animazione risponde a un tap, innescala prima all'interno del tap handler. Usa useEffect solo quando la source of truth si trova al di fuori di quell'interazione.

Ottimizzazione delle performance per app in produzione

Lottie React Native è una di quelle librerie che sembra leggera finché i team non iniziano a inserire grandi file JSON nell'app bundle e si chiedono perché lo startup sia peggiorato. L'animazione in sé non è sempre il problema. È la strategia di delivery.

Infografica sui tre vantaggi principali dell’ottimizzazione delle prestazioni di Lottie: bundle più piccolo, frame rate migliori e minore utilizzo della memoria.

Dove i team incontrano problemi

L'errore più comune è includere ogni animazione direttamente nel JavaScript e caricarle tutte troppo presto. Secondo questa guida sulla gestione errata dei file Lottie JSON, sovraccaricare i bundle JS con asset come i JSON di Lottie può aumentare i tempi di avvio dell'app di 40% o più su dispositivi di fascia media, e spostarli in asset nativi per il caricamento on-demand è un'ottimizzazione cruciale.

Questo è in linea con ciò che molti team osservano nella pratica. Il problema non è una singola piccola animazione di successo. È l'accumulo:

  • motion di onboarding
  • stati di loader
  • reazioni e-commerce
  • schermate vuote brandizzate
  • file di locale e altri asset pesanti nel bundle accanto a questi

Se la tua app ha già un problema di budget di avvio, i file Lottie possono peggiorarlo rapidamente.

Cosa ottimizzare per primo

Inizia dall'export. Un export di animazione disordinato porta complessità che pagherai in parsing, memoria e stabilità del render. Non accettare ogni export del designer così com'è.

Usa questa checklist di produzione:

  • Comprimi il JSON prima di rilasciare: File più piccoli sono più facili da caricare e meno propensi a gonfiare l'avvio.
  • Sposta le animazioni non critiche fuori dal bundle JS: Mantieni l'avvio code focalizzato su ciò che l'app serve immediatamente.
  • Carica le animazioni on demand: Renderizza quando la schermata o l'azione lo richiede.
  • Analizza il comportamento su dispositivi vecchi: Un simulatore moderno può nascondere un playback costoso.
  • Evita di usare file Lottie grandi come decorazione all'avvio: Se non è critico per la prima interazione, non dovrebbe competere con l'avvio dell'app.

Per i team che lavorano seriamente sulle prestazioni mobili, la guida di AppLighter alle prestazioni mobili è una lettura utile perché colloca le decisioni sulle animazioni nel contesto più ampio di avvio dell'app, rendering e compromessi del framework.

Una verità scomoda: Un'animazione bella che ritarda la prima interazione è di solito un bug di prodotto, non un successo di design.

Dovresti anche guardare oltre React Native in isolamento. I team che lavorano con stack ibridi si scontrano con problemi simili di caricamento asset, e il contesto più ampio prestazioni delle animazioni per le app Capacitor si applicano bene anche alle decisioni su Lottie.

File locali vs distribuzione remota

I file locali sono prevedibili. Funzionano offline, eliminano la variabilità di rete e sono più facili da testare. Sono però facili da sovraccaricare nel bundle.

La distribuzione remota mantiene il binario più snello, ma ora la tua animazione deve tenere conto di disponibilità, caching e fallback. Questo compromesso è accettabile per motion non critici. È rischioso per stati UX principali come conferma d'acquisto o autenticazione riuscita.

Una separazione pratica funziona bene:

Tipo di asset Default migliore
Animazione di interazione principale Locale, ottimizzata, non troppo grande
Motion promozionale occasionale Remoto con fallback
Animazione nel percorso di avvio Solo locale se strettamente necessario
Illustrazione di funzionalità usata raramente Caricamento on-demand

Se applichi solo una regola da questa sezione, usa questa: tratta i JSON Lottie come asset critici per le prestazioni, non come decorazioni innocue.

Risoluzione dei problemi comuni di Lottie

Quando Lottie si rompe, la causa è di solito banale. Percorso sbagliato. Dimensioni mancanti. Timing del ref errato. JSON troppo pesante. Il modo più veloce per fare debug è ridurre le variabili.

L'animazione non viene renderizzata su Android

Prima conferma che il file JSON si risolva. Poi assegna al componente dimensioni esplicite.

<LottieView
  source={require('../assets/animations/success.json')}
  autoPlay
  style={{ width: 200, height: 200 }}
/>

Se continua a fallire, sostituiscilo con un'altra animazione nota e funzionante. Questo ti dirà se il problema è nel file o nella configurazione.

Il playback è scattoso sui dispositivi più vecchi

Di solito indica un problema nell'asset, non nel componente API.

Prova queste correzioni:

  • Riduci la complessità dell'animazione: Chiedi un export più leggero se il file sorgente è pesante.
  • Carica più tardi: Non competere con il lavoro della schermata iniziale.
  • Testa una versione compressa: Se il file compresso si comporta meglio, hai trovato il collo di bottiglia.
  • Rimuovi più viste Lottie simultanee: Diverse animazioni su una sola schermata possono essere troppe.

Il ref è null o play non fa nulla

I ref null di solito indicano che il trigger scatta prima del mount, oppure che il componente è stato rimosso in modo condizionale.

if (animationRef.current) {
  animationRef.current.play();
}

Mantieni il ref stabile con useRef, e non ricreare inutilmente il componente animato. Se stai debuggando stranezze ricorrenti nelle build locali, svuotare le cache obsolete può aiutare. Una semplice routine di pulizia della cache Yarn a volte basta a eliminare comportamenti fuorvianti degli asset durante lo sviluppo.

L'animazione appare sbagliata su schermi di dimensioni diverse

Non lasciare che l'animazione definisca il layout. Mettila in un contenitore e impostane le dimensioni di proposito.

  • Usa dimensioni fisse per icone e reazioni
  • Usa wrapper aspect-aware per illustrazioni più grandi
  • Evita di allargare a tutta la larghezza senza verificare la composizione prevista dell'export

La maggior parte dei report “Lottie è rotto” si rivela essere un problema di layout, asset o timing. La libreria fa esattamente quello che le hai chiesto.

Se ti serve un'ultima scorciatoia per il debugging, rimuovi tutte le prop avanzate, renderizza un'animazione locale in una view centrata e ricostruisci da lì. Questo approccio isola i problemi più velocemente che fissare uno schermo di produzione affollato.


Capgo aiuta i team a pubblicare fix di JavaScript, asset e config nelle app Capacitor senza aspettare la revisione dello store. Se mantieni un'app ibrida e ti serve un modo più sicuro per inviare aggiornamenti, gestire rollout graduali e recuperare rapidamente da problemi front-end, Capgo vale la pena dare un'occhiata.

Live updates per le app Capacitor

Quando un bug nel web-layer è live, rilascia la fix tramite Capgo invece di aspettare giorni l'approvazione degli store. Gli utenti ricevono l'update in background, mentre le modifiche native restano nel normale processo di review.

Ultimi articoli dal blog

Capgo ti offre gli insight migliori che ti servono per creare un'app mobile davvero professionale.