Transition animée entre deux images

D’une part, j’ai une mise en page avec deux ImageView:

    

Par contre, j’ai une liste de ressources images:

 static int mImages[] = new int[] { R.drawable.artistes, R.drawable.couple1, R.drawable.couple2, R.drawable.couple3, R.drawable.enfant, R.drawable.manege, R.drawable.manege2, R.drawable.metropolitain, R.drawable.panoramique, R.drawable.sacrecoeur }; 

J’ai aussi un planificateur fabriqué à partir de Handler + postDelayed () pour afficher les images l’une après l’autre avec une timer. Cela fonctionne bien

mon problème concerne l’animation de transition d’une image à l’autre, sachant que je dois nettoyer les images vues à chaque fois pour éviter les OutOfMemoryExceptions:

Pour l’instant, je le fais dans la méthode de rappel schduled:

 if (mIndex == mImages.length) { mIndex = 0; // repeat } if (mIndex % 2 != 0) { // pair mImageCross2.setImageResource(mImages[mIndex++]); Utils.crossfade(mImageCross2, mImageCross1, 1000/*duration*/); mImageCross1.setImageResource(0); } else { mImageCross1.setImageResource(mImages[mIndex++]); Utils.crossfade(mImageCross1, mImageCross2, 1000); mImageCross2.setImageResource(0); } 

avec cette animation:

 public static void crossfade(final ImageView viewIn, final ImageView viewOut, int duration) { Animation fadeIn = new AlphaAnimation(0, 1); fadeIn.setDuration(duration); Animation fadeOut = new AlphaAnimation(1, 0); fadeOut.setDuration(duration); fadeOut.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { viewOut.setVisibility(View.GONE); } }); fadeIn.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { viewIn.setVisibility(View.VISIBLE); } }); viewOut.startAnimation(fadeOut); viewIn.startAnimation(fadeIn); } 

L’animation n’est pas géniale, le fondu n’est pas vraiment lisse, que puis-je faire pour le rendre plus lisse tout en nettoyant ImageView à chaque fois?

Ma première suggestion est de simplifier la plupart de votre code. Android a cette jolie petite classe appelée TransitionDrawable

afin que vous puissiez avoir seulement 1 vue d’image et utiliser le TransitionDrawable:

 TransitionDrawable td = new TransitionDrawable( new Drawable[] { getResources().getDrawables(mImages[x]), getResources().getDrawables(mImages[y]) }); imageView.setImageDrawable(td); 

et appelez l’animation sur td avec

 td.startTransition(1000); // and td.reverseTransition(1000); 

et continuez à utiliser le postDelayed pour les déclencher