2012-04-10 30 views
10

Sto tentando di "concatenare" due animazioni insieme, quindi quando si completa, inizia l'altra. Funziona tranne un problema. Al termine della prima animazione, torna alla sua posizione originale. Sto impostando il riempimento dopo il vero. Cos'altro mi manca?Animazioni catena Android

Ecco il codice che sto usando. Nota, questo è in una classe che sta estendendo LinearLayout.

// FIRST ANIMATION 
mAnimation = new TranslateAnimation(0, PANEL_END_X, 0, 0); 
mAnimation.setDuration(PANEL_TRANSITION_TIME); 
mAnimation.setFillAfter(true); 

mAnimation.setAnimationListener(new Animation.AnimationListener() { 
    public void onAnimationEnd(Animation animation) { 

     // FIRST ANIMATION COMPLETE, CALL THE SECOND ANIMATION 
     startAnimation(mAlphaAnimation); 
    } 
}); 

// SECOND ANIMATION  
mAlphaAnimation = new AlphaAnimation(1.0f, 0.0f); 
mAlphaAnimation.setDuration(PANEL_ALPHA_TRANSITION_TIME); 
mAlphaAnimation.setFillAfter(true); 

Soluzione:

L'unico modo ho potuto ottenere questo lavoro per la mia soddisfazione è stato quello di utilizzare un AnimationSet, ma impostare l'offset iniziale della seconda animazione offset iniziale + durata della prima animazione, più un po 'di imbottitura. Non dovevano essere completamente esatti nel mio caso.

Ho provato a giocare con vari valori come suggerito da CommonsWare, ma otterrei sempre un tipo di effetto "snapping" in cui i valori tornerebbero al loro valore originale prima di prendere quello nuovo.

risposta

5

Al termine della prima animazione, si torna alla posizione originale. Sto impostando il riempimento dopo il vero. Cos'altro mi manca?

Le animazioni sono effetti temporanei. Se vuoi che gli effetti siano permanenti, devi farlo tu stesso nel onAnimationEnd(). Nel caso di un TranslateAnimation, è necessario modificare lo LayoutParams o qualcosa del widget interessato per mantenerlo in modo permanente nella sua posizione finale. Oppure, se lo stai traducendo dallo schermo, imposta la visibilità su View.GONE.

+2

consecutivi. AnimationSet.Builder è risultato essere quello che cercavo: http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html. – Steve

2

Provare a combinarli in un AnimationSet.

+0

non che entrambi svolgono contemporaneamente però? Voglio iniziare un'animazione dopo che l'altro è completo. – Steve

+0

Sì, hai ragione, mi dispiace. Ho frainteso questa frase nel Javadoc: "Le trasformazioni delle animazioni figlio sono applicate nell'ordine in cui sono state aggiunte" –

+0

Quella frase è confusa e sembra implicare che faccia ciò che voglio. Grazie comunque. – Steve

8

Ho trovato quella che credo sia la soluzione ideale in API di livello 11 e superiori utilizzando la classe AnimationSet.Builder.

L'oggetto Builder è una classe di utilità per facilitare l'aggiunta di animazioni ad un AnimatorSet insieme alle relazioni tra le varie animazioni. L'intenzione dei metodi Builder, insieme al metodo play() di AnimatorSet, è di rendere possibile esprimere le relazioni di dipendenza delle animazioni in modo naturale. Gli sviluppatori possono anche utilizzare i metodi playTogether() e playSequentially() se soddisfano le necessità, ma in alcune situazioni potrebbe essere più semplice esprimere AnimatorSet di animazioni a coppie

Ad esempio, questo imposta un AnimatorSet per riprodurre anim1 e anim2 allo stesso tempo, anim3 per giocare quando anim2 finiture, e anim4 a giocare quando anim3 finiture:

AnimatorSet s = new AnimatorSet(); 
s.play(anim1).with(anim2); 
s.play(anim2).before(anim3); 
s.play(anim4).after(anim3); 
+0

Si noti che questo è disponibile solo su API Livello 11 e versioni successive, quindi i dispositivi Android 1.x/2.x non possono usarlo. – CommonsWare

Problemi correlati