5
votes

Remplacer dynamiquement l'image dans l'animation Lottie lors de l'exécution

J'ai une animation After Effects, super simple, d'un carré en mouvement (forme AE). J'exporte l'animation au format .json en utilisant Bodymovin, et j'ajoute le fichier json en utilisant Lottie dans mon projet. Jusqu'ici tout va bien.

Le problème commence ici -> pendant l'exécution, remplacez ce "carré" par une image que j'ai également dans mon projet. Étant donné que cette image peut changer, je ne peux pas l'ajouter de manière statique à mon animation AE, j'ai donc besoin de l'ajouter dynamiquement pendant l'exécution. Il n'y a presque aucune information sur la façon de faire cela dans Android?


0 commentaires

3 Réponses :


4
votes

Lottie a un attribut XML app: lottie_imageAssetsFolder , qui peut également être défini au moment de l'exécution: animationView.setImageAssetsFolder ("images /"); . avec cet ensemble, on peut référencer des images dans le json . ceci est documenté en ligne; voir les commentaires au-dessus de la ligne # 599 et # 630 . ceci est également expliqué dans la documentation ( src / assets peut ne pas être une option, car il n'est pas accessible en écriture):

Parfois, les images ne sont pas fournies avec l'appareil. Vous pouvez le faire pour économiser de l'espace dans votre apk ou si vous avez téléchargé l'animation à partir du réseau. Pour gérer ce cas, vous pouvez définir un ImageAssetDelegate sur votre LottieAnimationView ou LottieDrawable . Le délégué sera appelé chaque fois que Lottie essaiera de rendre une image. Il passera le nom de l'image et vous demandera de renvoyer le bitmap. Si vous ne l'avez pas encore (si le téléchargement est encore en cours, par exemple), renvoyez simplement null et Lottie continuera à demander à chaque image jusqu'à ce que vous retourniez une valeur non nulle.

animationView.setImageAssetDelegate(new ImageAssetDelegate() {
    @Override
    public Bitmap fetchBitmap(LottieImageAsset asset) {
        if (downloadedBitmap == null) {
            // We don't have it yet. Lottie will keep asking until we return a non-null bitmap.
           return null;
        }
        return downloadedBitmap;
    }
});


2 commentaires

Merci Martin! J'ai besoin de demander cependant, que serait 'téléchargéBitmap' ici? Merci


Le 'dowloadedBitmap' serait-il un bitmap que je dois créer (l'image externe que je veux diriger au moment de l'exécution, convertie en bitmap?), Ou comment cela fonctionnerait-il? Merci!



7
votes

LottieAnimationView étend une ImageView . En d'autres termes, le LottieAnimationView est également un ImageView .

Vous pouvez donc définir une image sur LottieAnimationView de la même manière que vous définissez un image en ImageView

Par exemple:

if (isAnimated) {
    mLottieView.setAnimation("<json file name from asset folder>");
} else {
    mLottieView.setImageResource(R.drawable.square_image);
}

Ceci est juste un exemple de la façon dont vous pouvez jouer une animation (fichier json) il suffit d'afficher une image comme n'importe quel ImageView ..


0 commentaires

3
votes

J'ai réussi à faire ceci: le problème était que mon animation After Effects avait une forme vectorielle, et j'essayais de la remplacer. Après avoir changé l'animation originale pour avoir un .png à la place, je pourrais remplacer l'image au moment de l'exécution. A bien fonctionné.

// First I converted the png I wanted to see at runtime to a bitmap:

Bitmap bitmapImage = BitmapFactory.decodeResource(getResources(), R.drawable.imageBlah);

// I used the lambda: 

lottieAnimationView.setImageAssetDelegate( lottieImageAsset -> bitmapImage);

Cela a fonctionné pour UNE image, maintenant je vais voir comment remplacer plusieurs images lors de l'exécution.


1 commentaires

Avez-vous trouvé une solution pour remplacer plusieurs images lors de l'exécution?