【问题标题】:Add A New KeyFrame to Timeline While an Animation is Executing在动画执行时向时间轴添加新的关键帧
【发布时间】:2017-02-12 14:34:06
【问题描述】:

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

  1. 通过在Timeline 上调用pause() 来暂停动画,清除KeyFrames ObservableList,添加一个新的KeyFrame 并在Timeline 上调用play()
  2. 使用 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 列表还是需要创建新的时间轴?

【问题讨论】:

  • 好建议,James_D。我不知道有这样的班级。我实际上是在尝试以某种方式“弯曲”Timeline,以使我的自定义插值器计算的位置与传递给它的小数值无关。尝试让某些东西做它不打算做的事情从来都不是一件好事,而 AnimationTimer 可能更适合。请将您的评论作为答案,我将标记为正确。

标签: animation javafx javafx-8


【解决方案1】:

据我所知,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...
    }
}

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

【讨论】:

  • 这正是我想要实现的目标的正确类。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2022-10-18
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多