2014-09-26 24 views
14

un lato ho una disposizione con due ImageView:animata transizione tra due imageview

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:id="@+id/image_cross2" 
     android:layout_width="wrap_content" 
     android:layout_height="@dimen/image_size" 
     android:layout_gravity="top" 
     android:scaleType="centerCrop" /> 

    <ImageView 
     android:id="@+id/image_cross1" 
     android:layout_width="wrap_content" 
     android:layout_height="@dimen/image_size" 
     android:layout_gravity="top" 
     android:scaleType="centerCrop" /> 
</FrameLayout> 

D'altra parte ho un elenco di ressources immagine:

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    }; 

i avere anche un Scheduler fatto da Handler + postDelayed() per visualizzare le immagini una dopo l'altra con un timer. Questo sta lavorando bene

il mio problema riguarda l'animazione di transizione da un ImageView all'altro, sapendo che devo pulire le imageviews ogni volta per evitare di OutOfMemoryExceptions:

Per ora lo faccio nel schduled metodo di callback:

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); 
       } 

con questa animazione:

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'animazione non è eccezionale, la dissolvenza non è molto fluida, cosa posso fare per renderla più fluida mentre devo pulire ogni volta l'ImageView?

risposta

35

Il mio primo suggerimento è di semplificare la maggior parte del codice. Android ha questa piccola classe bello chiamato TransitionDrawable

così si può avere solo 1 visita dell'immagine e utilizzare il TransitionDrawable:

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

e chiamare l'animazione td con

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

e continuare ad usare il postDelayed per attivarli

+0

oh super bello, ci proverò grazie –

+0

oh, a proposito ... Ho digitato tutto a memoria, potrebbero esserci un paio di errori di battitura in giro, una volta digitato sull'IDE vedrai – Budius

+0

ottengo un'eccezione nullpointer a "getResources(). getDrawables (mImages [0])" anche usando direttamente i numeri di risorse getResources(). getDrawables (R.drawable.artistes), hai qualche idea? –

Problemi correlati