在动画执行时向时间轴添加新的KeyFrame

我想在它运行时修改Timeline,例如响应鼠标单击我想要更改动画的目标值 . 我已经尝试了几种方法来做到这一点,包括(在鼠标点击处理程序中):

  • 通过在 Timeline 上调用 pause() 来暂停动画,清除 KeyFrames ObservableList ,在 Timeline 上添加新的 KeyFrame 并调用 play() .

  • 使用Cue-name创建新的KeyFrame,将新帧添加到Observable列表并在 Timeline 上调用 jumpTo(cueName) .

一些示例代码是:

String cueName = String.valueOf(System.currentTimeMillis());
KeyValue kv = new KeyValue(myObject.rotateProperty(), -90 + 180.0 * Math.random(), new CustomInterpolator());
KeyFrame kf = new KeyFrame(Duration.seconds(10), cueName, kv);
startupTimeline.getKeyFrames().add(kf);
startupTimeline.jumpTo(cueName);
startupTimeline.play();

这些似乎都不起作用,动画就停止了 .

我是否应该能够修改现有时间轴的KeyFrame列表,或者如果我想在动画执行时更改动画,是否需要创建新的时间轴?

回答(1)

3 years ago

据我所知,一旦开始播放,就不能以这种方式改变 Timeline . 问题是您可能会更改总周期持续时间,这会混淆所有插值计算 .

你可能需要一个AnimationTimer . AnimationTimer 有一个抽象的 handle(long timestamp) 方法,它采用时间戳(以纳秒为单位),并在每次渲染场景图时调用 . 所以你可以这样做:

AnimationTimer animation = new AnimationTimer() {

    private long startTime = -1;

    @Override
    public void handle(long timestamp) {
        if (startTime == -1) {
            startTime = timestamp ;
        }

        long totalElapsedNanoseconds = timestamp - startTime ;
        // update UI based on elapsed time...
    }
}

在JavaFX应用程序线程上调用 handle() 方法,因此更新UI并引用仅在同一线程上更改的任何变量是安全的 .