web-dev-qa-db-fra.com

Android n'anime pas d'alpha s'il est initialement nul

J'essaie d'animer alpha d'une vue Android (deux animations, un fondu en entrée et un fondu en sortie). Tout fonctionne correctement si l'alpha de la vue est initialement égal à 1, par défaut. Cependant, je souhaite que cette vue soit initialement transparente, c'est pourquoi j'ai défini sa valeur alpha sur zéro:

indicatorContainer.setAlpha(0);

Maintenant, les animations ne fonctionneront pas. Cela ne deviendra jamais visible. Si je commente cette ligne, la vue est initialement affichée (ce que je ne souhaite pas), mais mes animations fonctionnent correctement lorsque je les appelle. Je pensais que c'était quelque chose d'anodin, mais apparemment ce n'est pas le cas. Qu'est-ce que je fais mal?

UPDATE: J'ai également essayé un 0f à virgule flottante au lieu d'un 0 après avoir lu certaines modifications de l'API impliquant la méthode setAlpha, pensant que mon appel pourrait appeler une surcharge incorrecte, mais rien n'a changé.

17
Can Poyrazoğlu

Essayez quelque chose comme ça: 

  mRelativeLayout.setAlpha(0f);
    mRelativeLayout.animate().alpha(1f).setDuration(500).setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            mRelativeLayout.setVisibility(View.VISIBLE);
            //OR
            mRelativeLayout.setAlpha(1f);
        }
    });
11
Nikhil Verma

On peut essayer de suivre, de manière plus simple:

view.animate (). alpha (1) .setDuration (ANIMATION_DURATION);

1
Ashlesha Sharma

J'ai rencontré le même problème où indicatorContainer est ImageButton. Le code ci-dessous résout ce problème très très ennuyant ...

// XXX: Does not work if just 0. It calls `ImageView#setAlpha(int)` deprecated method.
indicatorContainer.setAlpha(0.0f);
ViewCompat.animate(indicatorContainer).alpha(1);
1
ypresto

Cela peut n’être pas pertinent pour le PO mais j’ai pensé que je le partagerais quand même car cela pourrait aider quelqu'un à l’avenir.

Sachez que si votre animation initiale combine animate().alpha(0.0f) avec une manipulation de la translation de l’axe Y ou X de la vue (par exemple, animate().translationYBy(500), vous devez réinitialiser cette propriété avant de revenir en arrière (à l'aide de animate().alpha(1.0f)

Je suis tombé sur ce SO post pensant que le réglage de l'alpha sur 1.0f échouait alors qu'en réalité, il fonctionnait toujours comme il se doit, mais l'animation se déroulait hors écran car je n'avais pas réinitialisé mon axe Y. traduction ( Homer Simpson * doh * moment ).

Pour résoudre facilement ce problème, vous pouvez ajouter une AnimatorEndListener à votre animation une fois celle-ci terminée (comme @Nikhil Verma mentionné ci-dessus), où vous pouvez ajouter une seule ligne de code pour réinitialiser la traduction de l'axe X/Y. 

Dans le scénario auquel je faisais face, je voulais que l'animation vienne en fondu et disparaisse progressivement afin d'ajuster l'axe des ordonnées et l'alpha en conséquence. Après avoir flotté et s'estompé, j'ai configuré un écouteur pour réinitialiser la traduction de l'axe des Y de la manière suivante:

 loadingMask.animate().translationYBy(500); //starts animation by moving it down the screen
        loadingMask.animate().alpha(0.0f) //fades out
        .setDuration(1500) //over 1.5s
        .setListener(new AnimatorEndListener() { //when animation completes
            @Override
            public void onAnimationEnd(Animator animation) {
                loadingMask.setTranslationY(0); //reset the y axis translation
            }
        });

Désormais, lorsque je souhaite que l'animation se répète, je peux définir l'alpha de ma vue sur 1.0f et cela fonctionne comme prévu.

1
Scott Barbour

Voici comment j'ai pu résoudre ce problème - pas particulièrement élégant, mais gérable :

  1. Définissez la vue sur l'alpha initial que vous voulez 0.0f ou autre.

  2. Lorsque survient un événement pour lequel la vue doit avoir plus de visibilité/alpha (par exemple, juste avant de commencer une animation), vous pouvez alors mettre à jour l'alpha, puis exécuter l'animation sur la vue.

Je ressens toujours quelques hésitations lorsque l'animation se répète, mais cette approche peut fonctionner pour des scénarios dans lesquels l'animation ne se répète pas.

0
Gene Bo