Javafx Scene.snapshot方法性能低下

时间:2017-09-14 10:34:48

标签: java performance javafx javafx-2 javafx-8

我正在制作一个滑动动画来将场景切换到另一个场景,但是当我调用此方法时,它会延迟切换场景。我发现原因是类snapshot()的方法Scene。 有没有人有解决方案?

代码:

public void switchScene(Scene target) {
    Scene current = getPrimaryStage().getScene();
    WritableImage beforeImage;
    WritableImage afterImage;

    int width = ((int) ((Region) current.getRoot()).getWidth());
    int height = ((int) ((Region) current.getRoot()).getHeight());

    beforeImage = new WritableImage(width, height);
    ImageView leftImage = new ImageView(current.snapshot(beforeImage));

    afterImage = new WritableImage(width, height);
    ImageView rightImage = new ImageView(target.snapshot(afterImage));

    leftImage.setTranslateX(0);
    rightImage.setTranslateX(width);

    StackPane animation = new StackPane(leftImage, rightImage);
    animation.setPrefSize(target.getWidth(), target.getHeight());

    primaryStage.setScene(new Scene(animation));

    Timeline timeline = new Timeline();
    KeyValue kv = new KeyValue(rightImage.translateXProperty(), 0, Interpolator.EASE_BOTH);
    KeyFrame kf = new KeyFrame(Duration.seconds(0.75), kv);
    timeline.getKeyFrames().add(kf);
    timeline.setOnFinished(t -> {
        // remove pane and restore scene 1
        primaryStage.setScene(target);
    });
    timeline.play();
}

1 个答案:

答案 0 :(得分:1)

以这种方式拍摄快照本身就是一个缓慢的操作,在停留在Java领域时,没有太多可以加快它的速度。正如评论中所建议的,如果你真的想要拍摄快照,那么更好的方法是使用异步方法,它不会在运行时阻止UI线程(所以当它们仍然是延迟时,你的应用程序仍然会保持响应。)

但是,如果我已正确理解您的示例,则根本不需要使用屏幕截图 - 为什么使用图像而不仅仅是动画节点本身?请记住,所有JavaFX元素都是场景图的节点,因此可以以相同的方式进行动画处理。所以而不是:

StackPane animation = new StackPane(leftImage, rightImage);

你应该能够做到:

StackPane animation = new StackPane(source, target);

...然后使用它来直接为窗格设置动画,而无需经历一个缓慢的截屏过程。