2013-08-15 16 views
5

Sto lavorando su un'applicazione che ha bisogno di immagini dissolvenza incrociata tra più immagini,Android - Crossfade mutiple immagini in un ImageView

quello che ho: un ImageView e 50 drawable (.png), che mi scaricherà dal nuvola

quello che voglio: 50 disegnabile dovrebbe crossfade (dissolvenza in entrata e in uscita) in sequenza tra un intervallo di alcuni secondi

Quello che ho cercato: sulla base di alcune risposte qui su StackOverflow, ho provato la tecnica TransitionDrawable, ma Potevo solo dissolvenza incrociata tra 2 immagini e non più e quella con touchi ng.

il video di cui ho parlato: https://www.youtube.com/watch?v=atH3o2uh_94

risposta

-1

quindi creare il Drawable personalizzato che disegna due drawable con la modifica dei valori alfa, naturalmente è necessario aggiungere il supporto per lo scambio di drawable quando è necessario supportare quelli più

10

una visualizzazione personalizzata per farlo:

public class FadeView extends FrameLayout { 
    private long mFadeDelay = 1000; 
    private ImageView mFirst; 
    private ImageView mSecond; 
    private boolean mFirstShowing; 

    public FadeView(Context context) { 
     super(context); 
     init(context); 
    } 

    public FadeView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 

    public FadeView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context); 
    } 

    private void init(Context c){ 
     mFirst = new ImageView(c); 
     mSecond = new ImageView(c); 

     mFirst.setAlpha(1.0f); 
     mSecond.setAlpha(0.0f); 

     mFirstShowing = true; 

     addView(mFirst); 
     addView(mSecond); 
    } 

    public void setFadeDelay(long fadeDelay) { 
     mFadeDelay = fadeDelay; 
    } 

    public void ShowImage(Drawable d){ 
     if(mFirstShowing){ 
      mSecond.setImageDrawable(d); 
      mSecond.animate().alpha(1.0f).setDuration(mFadeDelay); 
      mFirst.animate().alpha(0.0f).setDuration(mFadeDelay); 
     }else { 
      mFirst.setImageDrawable(d); 
      mSecond.animate().alpha(0.0f).setDuration(mFadeDelay); 
      mFirst.animate().alpha(1.0f).setDuration(mFadeDelay); 
     } 

     mFirstShowing = !mFirstShowing; 
    } 
} 

Usage:

public class test extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     final FadeView fw = new FadeView(this); 
     setContentView(fw); 

     fw.setOnClickListener(new View.OnClickListener() { 
      Drawable d1 = getResources().getDrawable(android.R.drawable.ic_dialog_alert); 
      Drawable d2 = getResources().getDrawable(android.R.drawable.ic_dialog_info); 
      boolean flag; 

      @Override 
      public void onClick(View view) { 
       if(flag){ 
        fw.ShowImage(d1); 
       }else { 
        fw.ShowImage(d2); 
       } 
       flag = !flag; 
      } 
     }); 
    } 


} 
+0

Come posso farlo con Android> = API9 –

+0

Seleziono la risposta come risposta corretta. Ma penso che sia necessario indicare che l'azione ShowImage deve essere eseguita nel thread UI. Quindi, sarebbe bello sistemare il codice e passare un'attività come parametro o altro. fare la chiamata di animazione con qualcosa di simile: ShowImage public void (finale d Drawable) { mActivity.runOnUiThread (new Runnable() { @Override public void run() { se (mFirstShowing) {} else ... { ...} } }); } –

+0

@AnibalItriago Qualsiasi codice che interagisce con i tipi di vista deve essere eseguito sul thread principale. Visualizza la classe e i suoi discendenti non eseguono internamente questa gestione, piuttosto costringono l'utente a chiamare il thread appropriato. –