2017-09-14 5 views
0

シーンを別のシーンに切り替えるためにスライドアニメーションを作成していますが、このメソッドを呼び出すと、シーン切り替えに遅延があります。その原因が、Sceneのメソッドsnapshot()であることがわかりました。 誰かが解決策を持っていますか?Javafx Scene.snapshotメソッドのパフォーマンスが低い

コード:

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(); 
} 
+0

あなたが何をしようとしているのかよく分かりません。しかし、なぜあなたは[スナップショット](http://docs.oracle.com/javafx/2/api/javafx/scene/Scene.html#snapshot(javafx.util.Callback、% 20javafx.scene.image.WritableImage))メソッド? – ItachiUchiha

答えて

0

このようにスナップショットを撮るには、Javaの土地に滞在しながら、それをスピードアップするために行うことができる非常に多くはありません、本質的に低速運転です。コメントで示唆しているように、本当にスナップショットを撮りたいのであれば、より良いアプローチは非同期メソッドを使用することです。非同期メソッドは実行中にUIスレッドをブロックしません(したがって、 )

しかし、私があなたの例を正しく理解していれば、スクリーンショットを使う必要は全くありません。なぜ、ノード自体をアニメートするのではなく、イメージを使用しているのですか?すべてのJavaFX要素はシーングラフのノードであるため、同じ方法でアニメートすることができます。だから、代わりに:

StackPane animation = new StackPane(leftImage, rightImage); 

あなただけ行うことができる必要があります:

StackPane animation = new StackPane(source, target); 

...その後、スクリーンショットを撮るのゆっくりとしたプロセスを経由せずに直接ペインをアニメーション化するためにこれを使用しています。

関連する問題