我对JavaFX还很陌生。我正在尝试制作这个时间轴,其中每个关键帧都在前一个关键帧完成后发生。到目前为止,每个步骤都按照我的要求一个接一个地发生。然而,我一播放动画,rotateBack关键帧就开始旋转我的对象。关于如何使rotateBack只在moveToRight之后播放,有什么提示吗?此外,我想为rotateBack完成其旋转前moveToTop播放。谢谢。
Pane selectedPane = select_pane.getValue();
double rootWidth = root_pane.getWidth();
double rootHeight = root_pane.getHeight();
double sixthWidth = rootWidth / 6;
KeyValue moveTopLeftX = new KeyValue(selectedPane.layoutXProperty(), 0);
KeyValue moveDownY = new KeyValue(selectedPane.layoutYProperty(), root_pane.getHeight() - selectedPane.getHeight());
KeyValue moveRightX = new KeyValue(selectedPane.layoutXProperty(), sixthWidth);
KeyValue rotate180 = new KeyValue(selectedPane.rotateProperty(), 180);
KeyValue moveToTopY = new KeyValue(selectedPane.layoutYProperty(), 0);
KeyFrame startFrame = new KeyFrame(Duration.seconds(3), moveTopLeftX, moveToTopY);
KeyFrame moveToRight = new KeyFrame(Duration.seconds(2), moveRightX);
KeyFrame rotateBack = new KeyFrame(Duration.seconds(3), rotate180);
KeyFrame moveToBottom = new KeyFrame(Duration.seconds(6), moveDownY);
KeyFrame moveToTop = new KeyFrame(Duration.seconds(6), moveToTopY);
Timeline timeline = new Timeline(startFrame, moveToBottom, moveToRight, rotateBack, moveToTop);
timeline.play();
字符串
到目前为止,我所尝试的是在上面的代码中显示。任何提示非常感谢。
2条答案
按热度按时间juud5qan1#
要在一个关键帧完成后才播放一个关键帧,您可以创建不同的时间轴,并在时间轴.setOnFinished()函数中播放下一个。
对于你的例子,它看起来像这样:
字符串
在这里,它将播放所有这些关键帧(startFrame,moveToBottom,moveToRight)第一,当所有动画完成时,它将播放rotateBack KeyFrame,当这一个完成时,它将播放moveToTop
hmtdttj42#
过渡是解决这个问题的好方法
提供了一个基于
SequentialTransition
而不是Timeline
的示例。您可以使用Timeline
来代替,正如其他评论或答案中所指出的那样。然而,对于您描述的功能,使用transitions似乎更适合。该示例对
TranslateTransition
和RotateTransition
类型的各种事务进行排序,以执行所需的动画。如果您希望部分序列并行执行,那么您可以对这些部分使用
ParallelTransition
(如果需要,可以组合并行和顺序转换)。动画使用translate属性
在执行动画时,应该使用translate X/Y/Z属性,而不是layoutX/Y属性。虽然您可以对布局更改进行动画处理,但这是一个高级主题,不建议对JavaFX新手使用。这里提供的示例基于translate属性,而不是layout属性。
选择合适的插值器
关键帧的默认插值器是
LINEAR
,过渡的默认插值器是EASE_BOTH
。通过在关键帧或过渡上设置插值器来选择适合您应用程序的插值器。对于这个例子,我觉得过渡的默认EASE_BOTH
插值是最合适的,从而产生更平滑的动画感觉。示例代码
字符串