2014-09-26 11 views
14

Auf der einen Seite habe ich ein Layout mit zwei Image:animierte Übergang zwischen zwei 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> 

Auf der anderen Seite habe ich eine Liste von Bild ressources:

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 habe auch einen Scheduler aus Handler + postDelayed() um die Bilder nacheinander mit einem Timer anzuzeigen. Dies funktioniert gut

mein Problem geht es um die Übergangsanimation von einem Imageview zum anderen, wohl wissend, dass i die imageviews jedes Mal reinigen müssen, um zu OutOfMemoryExceptions zu vermeiden:

Vorerst ich das tun in der schduled Callback-Methode:

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

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

Die Animation ist nicht großartig, die verblassen ist nicht wirklich glatt, was kann ich tun, um es reibungsloser zu machen, während die ImageView jedes Mal reinigen?

Antwort

35

Mein erster Vorschlag ist es, den Großteil Ihres Codes zu vereinfachen. Android hat dieses nette kleine Klasse namens TransitionDrawable

so können Sie nur 1 Bild Ansicht haben und verwenden Sie die TransitionDrawable:

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

und rufen Sie die Animation auf td mit

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

und halten die Verwendung von postDelayed, um sie auszulösen

+0

oh super schön, ich werde versuchen, dass danke –

+0

oh, übrigens ... Ich tippte alle th auswendig, es könnte ein paar Tippfehler geben, sobald Sie es in der IDE tippen, sehen Sie – Budius

+0

Ich bekomme eine Nullpointer-Ausnahme bei "getResources(). getDrawables (mImages [0])" sogar mit den Ressourcen Nummern direkt getResources(). getDrawables (R.drawable.artistes), haben Sie eine Idee? –

Verwandte Themen