Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:在某些情况下会忽略持续时间吗?_Javafx - Fatal编程技术网

JavaFX:在某些情况下会忽略持续时间吗?

JavaFX:在某些情况下会忽略持续时间吗?,javafx,Javafx,我正在编写代码,使用时间线移动球。在以下代码中,持续时间(1000)可以正常工作: private void moveTheBall(double currentCenterX){ timeline = new Timeline(); timeline.setCycleCount(1); KeyValue keyValue = new KeyValue(ball.centerXProperty(), 0); KeyFrame keyFrame = ne

我正在编写代码,使用时间线移动球。在以下代码中,持续时间(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();

}
但当我使用不同的关键帧构造器手动移动球时,我必须使用持续时间(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对象的关键帧构造函数呢?

在第一个示例中,指定时间点为1秒的
关键帧
,以及将
centerX
设置为
0
KeyValue
。这意味着当动画运行时,它将插值
centerX
属性值,使其在1秒后结束,并等于
0

在第二个示例中,您没有指定
KeyValue
,而是指定了一个时间点为5毫秒的
关键帧以及在该时间点要执行的操作;也就是说,将
centerX
属性递减一定量。也可以使动画无限期运行,但在达到目标值时手动停止。这意味着操作将每5毫秒调用一次

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


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

我的猜测是检查内部类lambda表达式中写入的逻辑。无论在哪里使用,持续时间都是应该的。@ItachiUchiha但在我的第二个示例中,您可以看到所有的逻辑。我只是改变球的中心坐标,仅此而已。如果没有具体的例子,很难提出任何建议。可能是,如果您发布一个,它可以帮助调试您的问题。当前版本的代码在这里。按键盘上的S键将开始球的移动。要尝试以前版本的moveTheBall(),需要使用pingpong.fxml中的PingPongController_v4。谢谢。@YakovFain你可能会感兴趣。该博客文章中的示例演示了如何以恒定持续时间或恒定速度移动圆。centerX的起始值为365(我在GitHub上发布了代码,链接在OP的注释中)。BALL\u MOVEMENT\u INCREMENT=5。@James\D您的回答解释了我代码的行为。所以基本上,持续时间可以有两种不同的含义,这取决于它的用途:1。达到目标2的时间间隔长度。尝试运行事件处理程序中指定的代码之间的间隔。javadoc中没有对此进行解释。谢谢。这其实不是两种不同的意思。
关键帧
有一个时间点,由
持续时间
指定。它有一个
onFinished
处理程序,并且有零个或多个
KeyValue
s。动画将在开始和时间点之间插入所有
KeyValue
s的值,当到达时间点时,将调用
onFinished
处理程序(如果存在)。虽然描述相当简洁,但作者还是这样说的。