2009-07-07 4 views
0

J'utilise la classe Animator du Timing Framework pour effectuer une animation simple (déplacement d'un JPanel), à peu près à partir d'exemples dans Filthy Rich ClientsJava Framework timing - événement déclencheur à la fin d'une animation Animator

J'ai surchargée timingEvent() comme suit

public void timingEvent(float arg0) { 

    float fraction = this.animator.getTimingFraction(); 
    fraction = Math.min(1.0f, fraction); 

    if (fraction >= 1.0f) { 
     this.mainGUI.initiateSwitchToMainScreenTransition(); 
    } else if (fraction < 0.5f) { 
     this.translateY = (int) (MAX_Y * (2 * fraction)); 
     repaint(); 
    }  
} 

J'ai peinture surchargée() pour utiliser la valeur translateY pour déplacer le panneau vers le bas.

L'animation elle-même fonctionne parfaitement.

Mon problème est l'appel à launchSwitchToMainScreenTransition(), que je veux effectuer lorsque l'animation est terminée. Alors que cela fonctionne, il y a un retard important entre la fin de l'animation et le déclenchement de l'appel (le débogage a confirmé que le problème n'est pas la durée du temps initialisé par initSwitchToMainScreenTransition() - le délai se produit avant l'appel).

Y a-t-il un meilleur moyen d'y parvenir, c'est-à-dire sans délai?

Répondre

0

Si vous implémentez org.jdesktop.animation.timing.TimingTarget alors il y a une méthode end() qui doit être appelée lorsque l'animation est terminée - qui semble fonctionner pour moi quand je l'ai utilisé. Je ne pense pas que vous pouvez garantir que le timingEvent sera appelé après que la fraction a atteint 1.0.

Votre implémentation ne semble pas faire quoi que ce soit pour la seconde moitié du temporisateur (lorsque la fraction est comprise entre 0,5 et 1,0). Si vous voulez que l'animation continue pendant toute la durée de la minuterie, vous pouvez réorganiser votre code comme ceci:

@Override 
public void timingEvent(float fraction) { 
    translateY = (int) (MAX_Y * fraction); 
    repaint(); 
}  

@Override 
public void end() { 
    mainGUI.initiateSwitchToMainScreenTransition(); 
} 
+0

Merci pour cela. J'ai effectivement remarqué la méthode end() la nuit dernière et suis passé à l'utiliser. Cependant, il ne s'est pas débarrassé du retard malheureusement. J'ai mis mon animation à 1800ms mais il semble qu'elle se termine à peu près en 1000ms, ce qui entraîne un délai de 800ms avant que mon code ne soit déclenché. – William

Questions connexes