web-dev-qa-db-fra.com

Android alpha animation fadein fondu avec retards

Je veux faire une animation alpha très simple mais je ne trouve pas de moyen valide.

L'idée est de réaliser cette animation sur une vue:

  1. alpha de 0 à 1 de 1 seconde
  2. maintenez l'alpha à 1 pendant 5 secondes
  3. alpha de 1 à 0 de 1 seconde
  4. maintenez alpha à 0 pendant 5 secondes.
  5. recommencer le 1.

J'ai essayé de l'implémenter avec un AnimationSet comme:

AnimationSet animationSet = new AnimationSet(true);

Animation animation1 = new AnimationUtils.loadAnimation(this, Android.R.anim.fade_in);
animation1.setDuration(1000);

Animation animation2 = new AnimationUtils.loadAnimation(this, Android.R.anim.fade_out);
animation2.setDuration(1000);
animation2.setStartOffset(5000);

Animation animation3 = new AlphaAnimation(0.0f, 0.0f);
animation3.setDuration(4000)
animation3.setStartOffset(6000);

animationSet.add(animation1);
animationSet.add(animation2);
animationSet.add(animation3);

etc..

mais il semble que la troisième animation gâche toutes les animations alpha, je suppose que cela provoque une incohérence interne dans la manière dont Android gère ce type d'animation.

Une idée?

Je vous remercie.

36
zegnus

Ok Gardez à l'esprit ces 2 points pour résoudre ce problème


  • Si je veux animer 1.0f to 0.0f Après 5 secondes avec une durée d'animation de 1 seconde, c'est finalement une animation de 1 seconde avec une pause de 5 secondes.

    Pour y parvenir:

    1. setDuration(1000) (il a une durée de 1 seconde)
    2. setStartOffset(5000) (il démarrera après 5 secondes)

  • Vous n'avez besoin que de 2 animations qui boucleront pour toujours.

    1. 0.0f to 1.0f Avec une pause de 5 secondes et une durée de 1 seconde

    2. 1.0f to 0.0f Avec une pause de 5 secondes et une durée de 1 seconde


Et voici le code:

    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    textView.startAnimation(animation1);

Cependant pour boucler pour toujours j'utiliserai AnimationListener car repeatCount est bogué:

    animation1 = new AlphaAnimation(0.0f, 1.0f);
    animation1.setDuration(1000);
    animation1.setStartOffset(5000);

    //animation1 AnimationListener
    animation1.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation2 when animation1 ends (continue)
            textView.startAnimation(animation2);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    animation2 = new AlphaAnimation(1.0f, 0.0f);
    animation2.setDuration(1000);
    animation2.setStartOffset(5000);

    //animation2 AnimationListener
    animation2.setAnimationListener(new AnimationListener(){

        @Override
        public void onAnimationEnd(Animation arg0) {
            // start animation1 when animation2 ends (repeat)
            textView.startAnimation(animation1);
        }

        @Override
        public void onAnimationRepeat(Animation arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(Animation arg0) {
            // TODO Auto-generated method stub

        }

    });

    textView.startAnimation(animation1);
106
Sherif elKhatib

Il existe une solution plus simple à cela.

Supposons que votre vue soit dans l'état GONE. Pour animer sa visibilité:

yourView.setVisibility(View.VISIBLE);
yourView.animate().alpha(1).setDuration(300);

De la même manière, vous pouvez ajouter des écouteurs d'animation.

Cela fonctionne également pour les animations d'échelle et de traduction.

17
amalBit