JavaFX:在某些情况下是否忽略了持续时间?

JavaFX: Is Duration ignored in some cases?

我正在编写代码以使用时间轴移动球。在以下代码中,Duration(1000) 工作正常:

    private void moveTheBall(double currentCenterX){

    timeline = new Timeline();
    timeline.setCycleCount(1);

    KeyValue keyValue = new KeyValue(ball.centerXProperty(), 0);
    KeyFrame keyFrame = new KeyFrame(new Duration(1000), keyValue);
    timeline.getKeyFrames().add(keyFrame);

    timeline.play();

}

但是当我使用不同的 KeyFrame 构造函数手动移动小球时,我不得不使用 Duration(5) 以相同的速度移动小球:

 private void moveTheBall(double currentCenterX){


    KeyFrame keyFrame = new KeyFrame(new Duration(5), event -> {

        if (currentBallX > BALL_MOVEMENT_INCREMENT) {
            currentBallX -= BALL_MOVEMENT_INCREMENT;
        } else {
            timeline.stop();
        }

        ball.setCenterX(currentBallX);
    });

    timeline = new Timeline(keyFrame);
    timeline.setCycleCount(Timeline.INDEFINITE);

    timeline.play();

}

我知道当我在事件处理程序中实现某些操作时,它们可能需要更长的时间,但为什么不提供一个不需要指定无论如何都不起作用的 Duration 对象的 KeyFrame 构造函数?

在第一个示例中,您指定了时间点为 1 秒的 KeyFrame 和将 centerX 设置为 0KeyValue。这意味着当动画 运行s 时,它将插入 centerX 属性 值,以便它在 1 秒结束时等于 0.

在第二个示例中,您没有指定 KeyValue,但指定了 KeyFrame,时间点为 5 毫秒,并且在该时间点要执行的操作;也就是说,将 centerX 属性 减少一些固定的数量。您还可以无限期地制作动画 运行,但是当您达到目标值时手动停止它。这意味着该操作将每 5 毫秒调用一次。

请注意,在这种情况下,您实际上是在硬编码 200Hz 的帧速率(每 5 毫秒一帧)。您不会达到此帧速率,因为 JavaFX 的目标帧速率当前为 60Hz;您的更新将合并为每帧的单个更新。如果更高版本的 JavaFX 具有更高的帧速率,您的动画可能不如第一个版本那么流畅。

在第二个示例中球以与第一个相同的速度移动的原因只是由于一些数学(基于您没有向我们展示的一些值)。在第二个示例中,您的事件处理程序每​​ 5 毫秒调用一次,因此每秒调用 200 次。所以我猜测 centerX 的起始值等于 200 * BALL_MOVEMENT_INCREMENT.