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

时间:2017-02-12 14:34:07

标签: animation javafx javafx-8

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

  1. 通过致电pause()上的Timeline暂停动画,清除KeyFrames ObservableList,添加新的KeyFrame并致电play() Timeline
  2. 使用Cue-name创建新的KeyFrame,将新框架添加到Observable列表并在jumpTo(cueName)上调用Timeline
  3. 一些示例代码是:

    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 个答案:

答案 0 :(得分:3)

据我所知,Timeline一旦开始播放就无法以这种方式改变。问题是你可能会改变总循环持续时间,这会混淆所有插值计算。

你可能需要一个AnimationTimerAnimationTimer有一个抽象的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并引用仅在同一线程上更改的任何变量是安全的。