web-dev-qa-db-fra.com

Android change l'image de fond avec l'animation d'ouverture/fermeture en fondu

J'ai écrit un code qui peut changer l’image d’arrière-plan de manière aléatoire toutes les 5 secondes. Je souhaite maintenant utiliser l’animation en fondu pour modifier l’image d’arrière-plan, mais je ne sais pas comment utiliser cette animation.

Ceci est une ma source:

void handlechange() {

    Handler hand = new Handler();
    hand.postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            // change image here
            change();

        }

        private void change() {
            // TODO Auto-generated method stub

            Random Rand = new Random();

            int index = Rand.nextInt(image_rundow.length);

            mapimg.setBackgroundResource(image_rundow[index]);

            handlechange();
        }
    }, 4000);

}

Pour le moment, tout va bien. Je peux changer l’image d’arrière-plan de manière aléatoire, mais je ne sais pas comment utiliser le fondu en animation.

Si quelqu'un connaît la solution, aidez-moi s'il vous plaît, merci.

12
BekaKK

Vous devez appeler ces codes.

Tout d’abord, vous devez créer deux fichiers xml pour une animation de fondu en avant et arrière comme celle-ci.

fade_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<alpha
        Android:fromAlpha="0.0"
        Android:toAlpha="1.0"
        Android:fillAfter="true"
        Android:duration="2000"
        />
</set>

fade_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<alpha
        Android:fromAlpha="1.0"
        Android:toAlpha="0.0"
        Android:fillAfter="true"
        Android:duration="2000"
        />
</set>

Deuxièmement, vous devez exécuter une animation de imageView comme ci-dessous et vous devez également configurer AnimationListener pour modifier le fondu à la fin du fondu.

Animation fadeIn = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_in);
imageView.startAnimation(fadeIn);

fadeIn.setAnimationListener(new Animation.AnimationListener() {
      @Override
      public void onAnimationStart(Animation animation) {
      }
      @Override
      public void onAnimationEnd(Animation animation) {
          Animation fadeOut = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_out);
          imageView.startAnimation(fadeOut);
      }
      @Override
      public void onAnimationRepeat(Animation animation) {
      }
});
16
kimkevin

Pour une animation en fondu, créez un nouveau dossier nommé 'anim' dans votre dossier de ressources et créez-le dans fade_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <alpha
        Android:duration="@Android:integer/config_mediumAnimTime"
        Android:fromAlpha="0.0"
        Android:interpolator="@Android:anim/decelerate_interpolator"
        Android:toAlpha="1.0" />

</set>

maintenant pour lancer cette animation sur votre imageview, utilisez le code suivant dans votre activité 

Animation anim = AnimationUtils.loadAnimation(YourActivity.this, R.anim.fade_in);
imageView.setAnimation(anim);
anim.start();

pour une animation en fondu, il suffit d'échanger les valeurs d'Android: fromAlpha et Android: toAlpha

J'espère que cela t'aides.

5
akshay7692

Vous pouvez utiliser relativeLayout et ajouter une couche de vue d'arrière-plan définissant à la fois la hauteur et la largeur match_parent. Tous les autres éléments de l'interface utilisateur doivent figurer au-dessus de cette vue. Dans votre code Définir les animations fadeOut et fadeIn. Trouvez cette vue en arrière-plan par id, puis faites ceci:

 xxxBackground.startAnimation(fadeOut);
 xxxBackground.setBackgroundResource(R.drawable.your_random_pic);
 xxxBackground.startAnimation(fadeIn);

Vous pouvez utiliser un interpolateur pour ajuster la performance.

2
Ziwei Zeng

Vous avez besoin d'AnimationDrawable avec animation.

Première étape AnimationDrawable

-Créer un fichier /res/anim/anim_Android.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android"android:oneshot="false">
    <item Android:drawable="@drawable/Android_1"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_2"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_3"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_4"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_5"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_6"
          Android:duration="100"/>
    <item Android:drawable="@drawable/Android_7"
          Android:duration="100"/>
</animation-list>

-Ajouter un ImageView avec Android: src = "@ anim/anim_Android".

<ImageView
    Android:id="@+id/myanimation"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@anim/anim_Android" />

Deuxième étape

-Dans votre activité, créez AnimationDrawable et Animation

AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();
            animationDrawable.setOneShot(true);
            animationDrawable.start();

    Animation animation = AnimationUtils.loadAnimation(YourActivity.this, Android.R.anim.fade_in);

    imageView.setAnimation(animation);
        animation.start();
        animation.setAnimationListener(new Animation.AnimationListener() {
          @Override
          public void onAnimationStart(Animation animation) {
          }
          @Override
          public void onAnimationEnd(Animation animation) {
              Animation fadeOut = AnimationUtils.loadAnimation(YourActivity.this, Android.R.anim.fade_out);
              imageView.startAnimation(fadeOut);
          }
          @Override
          public void onAnimationRepeat(Animation animation) {
          }
});

vous n'avez pas besoin de Handler.

1
Cabezas

Réponse de kimkevin anime une View (que ce soit une ImageView, TextView etc.) et non un arrière-plan de View. Ce qui signifie que si vous souhaitez simplement mettre en surbrillance une variable View, vous devrez ajouter une autre variable View derrière celle-ci (appelons-la backgroundView) et animer cette image.

Utilisez le code suivant pour animer l'arrière-plan d'une vue

val startColor = view.solidColor
val endColor = ContextCompat.getColor(context, R.color.your_color)

val colorAnim = ObjectAnimator.ofInt(view, "backgroundColor", startColor, endColor, startColor)
colorAnim.duration = 2000
colorAnim.setEvaluator(ArgbEvaluator())
colorAnim.start()
0
Bugs Happen