2010-04-11 12 views
5

Tengo que animar una vista del estado A al B con cambios en su escala, posición y desplazamiento.Animación de traducción y escalado de vista en Android

El siguiente código casi hace el truco:

AnimationSet animation = new AnimationSet(true); 

int fromXDelta = view.getScrollX(); 
int fromYDelta = view.getScrollY(); 
view.scrollTo(0, 0); 
float scale = (float) widthB/(float) widthA; 
// Calculate toXDelta and toYDelta 

TranslateAnimation translateAnimation = new TranslateAnimation(-fromXDelta, -toXDelta, -fromYDelta, -toYDelta); 
translateAnimation.setDuration(duration); 
animation.addAnimation(translateAnimation); 

ScaleAnimation scaleAnimation = new ScaleAnimation(1, scale, 1, scale); 
scaleAnimation.setDuration(duration); 
animation.addAnimation(scaleAnimation); 
animation.setAnimationListener(new AnimationListener() { 

    @Override 
    public void onAnimationEnd(Animation arg0) { 
     view.clearAnimation(); 
     // Change view to state B by modifying its layout params and scroll 
    } 

    @Override public void onAnimationRepeat(Animation arg0) {} 
    @Override public void onAnimationStart(Animation arg0) {} 
}); 
view.startAnimation(animation); 

La lógica de onAnimationEnd hace la vista parpadeo después de que termine la animación. Además, si no llamo a clearAnimation(), la animación no funciona como se esperaba (¿por qué?).

¿Es esta la forma correcta de hacerlo?

Gracias!

Respuesta

2

No sé si es la manera correcta, pero estaba teniendo el mismo problema que usted. Me las arreglé para deshacerme del parpadeo agregando un:

animation.reset();

Justo antes del:

view.clearAnimation();

Nota: En su código, sería arg0.reset();

1

¿Has intentado configurar animation.setFillAfter(true)?

Básicamente permite que la última posición/estado de su vista permanezca cuando la animación haya terminado, evitando cualquier tipo de parpadeo.

Cuestiones relacionadas