我正在编写使用时间轴移动球的代码。在以下代码中,持续时间(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的不同构造函数手动移动球时,我不得不使用持续时间(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构造函数呢?
答案 0 :(得分:1)
在第一个示例中,您指定时间点为1秒的KeyFrame
和将KeyValue
设置为centerX
的{{1}}。这意味着当动画运行时,它将插入0
属性值,使其在1秒内完成,等于centerX
。
在第二个示例中,您没有指定0
,而是指定时间点为5毫秒的KeyValue
以及在该时间点采取的操作;即将KeyFrame
属性减少某个固定数量。您还可以无限期地运行动画,但在达到目标值时手动停止动画。这意味着将每5毫秒调用一次操作。
请注意,在这种情况下,您实际上是硬编码200Hz的帧速率(每5 ms一帧)。您将无法实现此帧速率,因为JavaFX的目标帧速率当前为60Hz;您的更新将合并为每帧的单个更新。如果JavaFX的更高版本的帧速率明显更高,那么您的动画可能不会像第一个版本那样流畅。
第二个例子中球以相同速度移动的原因与第一个相同仅仅是由于某些数学运算(基于您未向我们展示的某些值)。在第二个示例中,您的事件处理程序每5ms调用一次,因此每秒调用200次。所以我猜测centerX
的起始值等于centerX
。