2012-04-10 12 views
10

Estoy intentando "encadenar" dos animaciones juntas, de modo que cuando una completa, la otra comienza. Esto funciona, excepto por un problema. Después de que se completa la primera animación, vuelve a su posición original. Estoy estableciendo llenar después de verdad. ¿Qué más me estoy perdiendo?Android Chain Animations

Aquí está el código que estoy usando. Tenga en cuenta que esto se encuentra en una clase que extiende 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); 

Solución:

La única manera de que pudiera conseguir que esto funcione para mi satisfacción fue utilizar un AnimationSet, pero establece el desplazamiento inicial de la segunda animación de desplazamiento inicial + duración de la primera animación, más un pequeño relleno. No tenían que ser completamente exactos en mi caso.

Intenté jugar con varios valores, como CommonsWare sugirió, pero siempre obtendría algún tipo de efecto de "ajuste" donde los valores volverían a su valor original antes de tomar el nuevo.

Respuesta

5

Después de completar la primera animación, vuelve a su posición original. Estoy estableciendo llenar después de verdad. ¿Qué más me estoy perdiendo?

Las animaciones son efectos transitorios. Si desea que los efectos sean permanentes, debe hacerlo usted mismo en onAnimationEnd(). En el caso de un TranslateAnimation, debe cambiar el LayoutParams o algo del widget afectado para mantenerlo permanentemente en su posición final. O bien, si lo está traduciendo de la pantalla, configure la visibilidad en View.GONE.

+2

consecutivos El AnimationSet.Builder terminó siendo lo que necesitaba: http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html. – Steve

2

Intente combinarlos en un AnimationSet.

+0

¿eso no les ambos realizan de forma simultánea sin embargo? Quiero que una animación comience después de que la otra esté completa. – Steve

+0

Sí, tienes razón, lo siento. No entiendo bien esta frase en el Javadoc: "Las transformaciones de las animaciones secundarias se aplican en el orden en que se agregaron" –

+0

Esa frase es confusa y parece implicar que hace lo que quiero. Gracias de todos modos. – Steve

8

Encontré lo que creo que es la solución ideal en API nivel 11 y superior utilizando la clase AnimationSet.Builder.

El objeto Builder es una clase de utilidad para facilitar la adición de animaciones a un AnimatorSet junto con las relaciones entre las diversas animaciones. La intención de los métodos Builder, junto con el método play() de AnimatorSet es hacer posible expresar las relaciones de dependencia de las animaciones de forma natural. Los desarrolladores también pueden usar los métodos playTogether() y playSequentially() si estos se ajustan a la necesidad, pero puede ser más fácil en algunas situaciones expresar el AnimatorSet de animaciones en pares

Por ejemplo, esto configura un AnimatorSet para jugar anim1 y anim2 al mismo tiempo, anim3 jugar cuando anim2 acabados, y anim4 para jugar cuando anim3 acabados:

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

Tenga en cuenta que esto solo está disponible en API Nivel 11 y superior, por lo que los dispositivos Android 1.x/2.x no pueden usarlo. – CommonsWare

Cuestiones relacionadas