如何使用 JavaFX FadeTransition In 和 Out
How to use JavaFX FadeTransition In and Out
我正在尝试使用 "fade out" 和 "fade in" 转换来更改舞台场景。我真的很想得到它,但一点也不。
第一次,不行。然后,有时它工作正常,而其他情况下,新场景会在几毫秒内完全显示出来,然后继续进行其余的过渡。唯一运行完美的是 FadeOut。
我想我做错了什么,但我不知道是什么。
我尝试过使用 FadeTransition 和 Timeline,但结果总是一样。
我给你看我工作的代码片段:
//当我想改变场景时从控制器调用
private static FadeTransition fadeOut = new FadeTransition();
private static FadeTransition fadeIn = new FadeTransition();
public void setScene(final String resource_fxml, final String title) {
fadeOut.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
loadScene(resource_fxml, title);
}
});
fadeOut.setNode(lastRoot);
fadeOut.setDuration(Duration.millis(Config.TRANSITIONS_TIME));
fadeOut.setFromValue(1.0);
fadeOut.setToValue(0.0);
fadeOut.play();
}
private void loadScene(String resource_fxml, String title) {
double width = SceneManager.lastScene.getWidth();
double height = SceneManager.lastScene.getHeight();
Parent newRoot = null;
try {
newRoot = FXMLLoader.load(getClass().getResource(resource_fxml));
} catch (IOException ex) {
log.error("Resource not found");
}
// DoubleProperty opacity = newRoot.opacityProperty();
// Timeline fadeIn = new Timeline(
// new KeyFrame(Duration.ZERO, new KeyValue(opacity, 0.0)),
// new KeyFrame(Duration.millis(Config.TRANSITIONS_TIME), new KeyValue(opacity, 1.0))
// );
// fadeIn.play();
fadeOut.setNode(newRoot);
fadeOut.setDuration(Duration.millis(Config.TRANSITIONS_TIME));
fadeOut.setFromValue(0.0);
fadeOut.setToValue(1.0);
fadeOut.play();
lastScene = new Scene(newRoot, width, height);
mainStage.setTitle(title);
mainStage.setScene(lastScene);
mainStage.show();
lastRoot = newRoot;
}
编辑:我展示了最终代码 ("loadScene") ,它工作得很好。感谢您的提示,Steven Van Impe!
private void loadScene(String resource_fxml, String title) {
double width = SceneManager.lastScene.getWidth();
double height = SceneManager.lastScene.getHeight();
Parent newRoot = null;
try {
newRoot = XMLLoader.load(getClass().getResource(resource_fxml));
} catch (IOException ex) {
log.error("Resource not found");
}
fadeIn.setNode(newRoot);
fadeIn.setDuration(Duration.millis(Config.TRANSITIONS_TIME));
fadeIn.setFromValue(0.0);
fadeIn.setToValue(1.0);
DoubleProperty opacity = newRoot.opacityProperty();
opacity.set(0);
lastScene = new Scene(newRoot, width, height);
mainStage.setTitle(title);
mainStage.setScene(lastScene);
fadeIn.play();
lastRoot = newRoot;
}
您在 loadScene
中再次使用 fadeOut
。我想你想在那里使用 fadeIn
吗?此外,当 newRoot
甚至还不是场景图形的一部分时,您就开始了动画。您可能想先尝试设置场景(但开始时 newRoot
的不透明度为 0),然后再开始动画。
作为一般说明,我还建议您在更改屏幕时不要交换场景(甚至场景的根),而只需在您的 GUI 中交换窗格即可。这也将为您提供更大的动画灵活性。例如,您可以同时淡入新窗格并淡出旧窗格,如果您使用场景,这是不可能的。
我正在尝试使用 "fade out" 和 "fade in" 转换来更改舞台场景。我真的很想得到它,但一点也不。
第一次,不行。然后,有时它工作正常,而其他情况下,新场景会在几毫秒内完全显示出来,然后继续进行其余的过渡。唯一运行完美的是 FadeOut。
我想我做错了什么,但我不知道是什么。 我尝试过使用 FadeTransition 和 Timeline,但结果总是一样。
我给你看我工作的代码片段:
//当我想改变场景时从控制器调用
private static FadeTransition fadeOut = new FadeTransition();
private static FadeTransition fadeIn = new FadeTransition();
public void setScene(final String resource_fxml, final String title) {
fadeOut.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
loadScene(resource_fxml, title);
}
});
fadeOut.setNode(lastRoot);
fadeOut.setDuration(Duration.millis(Config.TRANSITIONS_TIME));
fadeOut.setFromValue(1.0);
fadeOut.setToValue(0.0);
fadeOut.play();
}
private void loadScene(String resource_fxml, String title) {
double width = SceneManager.lastScene.getWidth();
double height = SceneManager.lastScene.getHeight();
Parent newRoot = null;
try {
newRoot = FXMLLoader.load(getClass().getResource(resource_fxml));
} catch (IOException ex) {
log.error("Resource not found");
}
// DoubleProperty opacity = newRoot.opacityProperty();
// Timeline fadeIn = new Timeline(
// new KeyFrame(Duration.ZERO, new KeyValue(opacity, 0.0)),
// new KeyFrame(Duration.millis(Config.TRANSITIONS_TIME), new KeyValue(opacity, 1.0))
// );
// fadeIn.play();
fadeOut.setNode(newRoot);
fadeOut.setDuration(Duration.millis(Config.TRANSITIONS_TIME));
fadeOut.setFromValue(0.0);
fadeOut.setToValue(1.0);
fadeOut.play();
lastScene = new Scene(newRoot, width, height);
mainStage.setTitle(title);
mainStage.setScene(lastScene);
mainStage.show();
lastRoot = newRoot;
}
编辑:我展示了最终代码 ("loadScene") ,它工作得很好。感谢您的提示,Steven Van Impe!
private void loadScene(String resource_fxml, String title) {
double width = SceneManager.lastScene.getWidth();
double height = SceneManager.lastScene.getHeight();
Parent newRoot = null;
try {
newRoot = XMLLoader.load(getClass().getResource(resource_fxml));
} catch (IOException ex) {
log.error("Resource not found");
}
fadeIn.setNode(newRoot);
fadeIn.setDuration(Duration.millis(Config.TRANSITIONS_TIME));
fadeIn.setFromValue(0.0);
fadeIn.setToValue(1.0);
DoubleProperty opacity = newRoot.opacityProperty();
opacity.set(0);
lastScene = new Scene(newRoot, width, height);
mainStage.setTitle(title);
mainStage.setScene(lastScene);
fadeIn.play();
lastRoot = newRoot;
}
您在 loadScene
中再次使用 fadeOut
。我想你想在那里使用 fadeIn
吗?此外,当 newRoot
甚至还不是场景图形的一部分时,您就开始了动画。您可能想先尝试设置场景(但开始时 newRoot
的不透明度为 0),然后再开始动画。
作为一般说明,我还建议您在更改屏幕时不要交换场景(甚至场景的根),而只需在您的 GUI 中交换窗格即可。这也将为您提供更大的动画灵活性。例如,您可以同时淡入新窗格并淡出旧窗格,如果您使用场景,这是不可能的。