Comment changer AnimationTimer vitesse?
- Je utiliser AnimationTimer
pour plusieurs tâches, comme l'animation avec l'évolution des images et des ProgressIndicator
animation. Pour obtenir nécessaire de vitesse j'ai mis thread pour dormir, mais quand plusieurs animations sont en cours d'exécution simultanément, ils s'influencer les uns les autres de vitesse. Est-il un autre moyen pour changer la vitesse de AnimationTimer
? Échantillon de Code:
private void initialize() {
programButtonAnimation=new AnimationTimer(){
@Override
public void handle(long now) {
showClockAnimation();
}
};
programButtonAnimation.start();
}
private void showClockAnimation(){
String imageName = "%s_"+"%05d"+".%s";
String picturePath="t093760/diploma/view/styles/images/pink_frames/"+String.format( imageName,"pink" ,frameCount,"png");
programButton.setStyle("-fx-background-image:url('"+picturePath+"')");
frameCount++;
try {
Thread.sleep(28);
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
if(frameCount>=120){
programButtonAnimation.stop();
frameCount=0;
}
}
Vous devez vous connecter pour publier un commentaire.
La
AnimationTimer
'shandle
méthode est appelée une fois pour chaque image qui est affichée, sur le FX Thread d'Application. Vous ne devriez jamais bloquer le thread, il ne faut pasThread.sleep(...)
ici.Le paramètre passé à la
handle(...)
méthode est un timestamp, en nanosecondes. Donc, si vous voulez de l'accélérateur de mises à jour afin de ne pas se produire plus d'une fois tous les, dire 28 millisecondes, vous pouvez l'utiliser pour le faire:AnimationTimer
, je recommande la lecture de ceci et cecihandle
est appelé à un taux fixe, disons tous les 16ms ou alors, n'est-ce pas cette technique introduire la gigue en faisant des mises à jour à 16, 32, 16, 16, 32ms, et ainsi de suite?AnimationTimer
vous permet d'exécuter du code sur chaque "pulse", mais le contrôle de la génération d'impulsions est - délibérément - enterré profondément dans une impénétrable de la boîte noire.Puisque j'ai déjà écrit le code et James_D a été plus rapide de l'information sur vous de blocage de l'INTERFACE utilisateur, j'ai tout de même ajouter que si vous avez plusieurs AnimationTimers de différents timings vous devez créer une classe dédiée pour cela. Si chacun d'eux exécute à une vitesse différente, vous pourriez mettre en œuvre comme cela:
Ce qui signifie que la méthode handle() est invoquée au moins après sleepMs millisecondes qui se sont écoulées.
Ou de changement de paramètre et de spécifier les fps, ce que vous avez besoin.
Vous pouvez utiliser le code ci-dessus comme ceci:
Aussi, le chargement de l'image est pas le meilleur choix. Si vous souhaitez faire des animations, je vous suggère de prendre un coup d'oeil à Mike Blog sur La création d'un Sprite d'Animation avec JavaFX.
peut-être un peu hacky mais fait le travail