2
votes

Rendre l'animation de Lottie visible uniquement pendant la lecture

J'ai deux questions distinctes pour atteindre l'objectif indiqué dans le titre.

La première question est: quel est l'état de visibilité d'un com.airbnb.lottie.LottieAnimationView par défaut dans le XML? J'ai utilisé deux LottieAnimationView différents dans mon XML avec les mêmes caractéristiques:

lottieCatThrowsCup.setVisibility(View.VISIBLE);
lottieCatThrowsCup.playAnimation();
lottieCatThrowsCup.addAnimatorListener(this);
@Override
    public void onAnimationEnd(Animator animation) {

        animation.setVisibility(View.GONE);


    }

Et tandis que le premier n'est visible que lorsque j'utilise lottieanimationview.playAnimation () code > à partir du code, la seconde est immédiatement visible par défaut au démarrage de l'activité.

Ma deuxième question est due au problème décrit dans la première question. Pour résoudre ce problème, j'ai d'abord ajouté android: visibilité = "part" à ceux LottieAnimationView qui étaient immédiatement visibles au démarrage de l'activité, puis j'ai essayé plusieurs morceaux de code pour créer les animations visibles lors de leur lecture et de nouveau invisibles après avoir terminé (le tout sans succès):

Une tentative:

lottieCatThrowsCup.setVisibility(View.VISIBLE);
lottieCatThrowsCup.playAnimation();
lottieCatThrowsCup.cancelAnimation();

Une autre tentative: p >

lottieCatThrowsCup.setVisibility(View.VISIBLE);
lottieCatThrowsCup.playAnimation();
if(!lottieCatThrowsCup.isAnimating())lottieCatThrowsCup.cancelAnimation();

Troisième tentative:

lottieCatThrowsCup.setVisibility(View.VISIBLE);
lottieCatThrowsCup.playAnimation();
if(!(lottieCatThrowsCup.isAnimating())) lottieCatThrowsCup.setVisibility(View.GONE);

Quatrième tentative:

    <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/lottie_animation_ribbon_and_confetti"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:lottie_autoPlay="false"
        app:lottie_fileName="exploding-ribbon-and-confetti.json"
        app:lottie_loop="true"
        app:lottie_repeatCount="1"/>

    <com.airbnb.lottie.LottieAnimationView
        android:id="@+id/lottie_cat_throws_cup"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="@id/puntuacionTotal"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/puntosAtrevimiento"
        app:layout_constraintBottom_toTopOf="@id/textoAtrevimiento"
        app:lottie_autoPlay="false"
        app:lottie_fileName="cat_throws_cup.json"
        app:lottie_loop="true"
        app:lottie_repeatCount="1"
        />

À mon l'esprit, la solution la plus simple serait d'utiliser un attribut xml sur com.airbnb.lottie.LottieAnimationView pour indiquer qu'il ne doit pas être visible par défaut à moins qu'il ne soit lu, mais cela ne semble pas pour en exister un ... Comment résoudriez-vous ça? Merci d'avance.


0 commentaires

3 Réponses :


5
votes

Il existe également d'autres écouteurs que vous pouvez utiliser pour masquer / afficher la vue Lottie .

mAddedToCartAnimation.addAnimatorListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
            Log.e("Animation:","start");
            lottieCatThrowsCup.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            Log.e("Animation:","end");
            lottieCatThrowsCup.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            Log.e("Animation:","cancel");
        }

        @Override
        public void onAnimationRepeat(Animator animation) {
            Log.e("Animation:","repeat");
        }
    });


3 commentaires

Bonjour ami, cela fonctionne. J'ai cependant une autre question. J'ai de nombreuses animations sur cette même activité, savez-vous s'il existe un moyen d'utiliser un objet d'animation général à l'intérieur de onAnimationStart et onAnimationEnd au lieu de lottieCatThrowsCup afin que, en fonction de l'animation cliquée, onAnimationStart dise quelque chose comme animation.setVisibility (View .VISIBLE)? (bien sûr auparavant, j'aurais utilisé .addAnimationListener (this) pour toutes les animations)


Le problème avec votre solution est que si j'ai de nombreuses animations qui doivent être définies sur VISIBLE dans onAnimationStart, je ne veux pas que toutes soient visibles lorsqu'une seule est lue.


@assensi Avoir un seul objet pour toutes les animations Lottie peut créer un problème. Chaque animation aura une durée différente. L'objet unique ne fonctionnera pas dans ce cas. Vous devez avoir différents auditeurs pour chaque vue Lottie que vous avez sur votre écran.



0
votes

Utilisez ceci:

lottieCatThrowsCup.setVisibility(View.VISIBLE);
lottieCatThrowsCup.playAnimation();
lottieCatThrowsCup.addAnimatorListener(this);

@Override
public void onAnimationEnd(Animator animation) {
    lottieCatThrowsCup.setVisibility(View.GONE);
}


0 commentaires

1
votes

Ajoutez Animator.AnimatorListener à votre LottieAnimationView et gérez sa visibilité dans onAnimationStart() et onAnimationEnd() final

lottieAnimationView.addAnimatorListener(new Animator.AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animator) {
             // Make the LottieAnimationView visible here    
            }


            @Override
            public void onAnimationEnd(Animator animator) {
             // Hide the LottieAnimationView here
            }


            @Override
            public void onAnimationCancel(Animator animator) {

            }


            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });


0 commentaires