如何改变AnimationTimer的速度?

时间:2015-05-10 00:50:28

标签: java animation timer javafx

我使用AnimationTimer执行多项任务,例如更改图片的动画和ProgressIndicator动画。为了达到所需的速度,我让线程进入睡眠状态,但是当几个动画同时运行时,它们会影响彼此的速度。有没有其他方法来改变AnimationTimer的速度?代码示例:

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;
    }
}

3 个答案:

答案 0 :(得分:6)

在FX应用程序主题上为每个呈现的帧调用AnimationTimer的{​​{1}}方法。你永远不应该阻止该线程,所以不要在这里调用handle

传递给Thread.sleep(...)方法的参数是一个时间戳,以纳秒为单位。因此,如果您想要限制更新,以便它们不会每次发生多次,比如28毫秒,您可以使用它来执行此操作:

handle(...)

答案 1 :(得分:3)

由于我已经编写了代码并且James_D在告知您阻止UI时速度更快,我仍然想补充一点,如果您有多个不同时序的AnimationTimers,您应该为此创建一个专用类。如果它们中的每一个以不同的速度运行,您可以像这样实现它:

import javafx.animation.AnimationTimer;

public abstract class AnimationTimerExt extends AnimationTimer {

    private long sleepNs = 0;

    long prevTime = 0;

    public AnimationTimerExt( long sleepMs) {
        this.sleepNs = sleepMs * 1_000_000;
    }

    @Override
    public void handle(long now) {

         // some delay
        if ((now - prevTime) < sleepNs) {
            return;
        }

        prevTime = now;

        handle();
    }

    public abstract void handle();

}

这意味着至少在sleepMs毫秒过去之后调用handle()方法。

或者您可以更改参数并指定fps,无论您需要什么。

您可以使用上面的代码:

AnimationTimerExt timer = new AnimationTimerExt(100) {

    @Override
    public void handle() {

        System.out.println( System.currentTimeMillis());

    }
};

timer.start();

此外,反复加载图片并不是最佳选择。如果您想制作动画,我建议您查看Mike关于Creating a Sprite Animation with JavaFX的博客。

答案 2 :(得分:0)

new AnimationTimer() {
int frameCount = 0;
        @Override
        public void handle(long currentNanoTime) {

            if (frameCount % 2 == 0) {
             // 30 fps ?
           }         
           frameCount++;
}

可能有点笨拙,但可以完成工作