2010-04-11 3 views
5

Je dois animer une vue de l'état A à B en modifiant son échelle, sa position et son défilement.Animer la traduction et la mise à l'échelle de la vue sous Android

Le code suivant fait presque le tour:

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 logique de onAnimationEnd fait scintiller la vue après la fin animation. Aussi, si je n'appelle pas clearAnimation() l'animation ne fonctionne pas comme prévu (pourquoi?).

Est-ce la bonne façon de procéder?

Merci!

Répondre

2

Je ne sais pas si c'est la bonne façon, mais j'avais le même problème que vous. J'ai réussi à me débarrasser du scintillement en ajoutant un:

animation.reset();

Juste avant le:

view.clearAnimation();

Remarque: Dans votre code, ce serait arg0.reset();

1

Avez-vous essayé de définir animation.setFillAfter(true)?

Il laisse essentiellement la dernière position/état de votre vue persister lorsque l'animation est terminée, évitant toute sorte de scintillement.

Questions connexes