Hallo liebe Communiy,
ich spiele gerade mit der FadeTransition-Klasse von JavaFX herum und versuche dabei die Animation aus dem Film Matrix nachzubauen.
Bisher funktioniert alles soweit, allerdings möchte ich nach dem ein Durchlauf der Transition durchgelaufen ist, das verwendete Bild ändern. (Von 0 auf 1 und von 1 auf 0)
FadeTransition bietet die Methode setOnFinished an, welche allerdings nur ganz am Ende der Animation und nicht zwischen den einzelnen Durchläufen ausgeführt wird. (Damit funktioniert das ganze bei Infinite Loops gar nicht.
Hat jemand eine Idee, wie ich dieses Problem lösen/umgehen kann, und kann mir außerdem sagen, wie ich diesen Effekt ohne "Schlieren" von links nach rechts ermöglichen kann?
Mein Code:
Vielleicht habt ihr ja noch Verbesserungsvorschläge, wie ich das ganze eleganter lösen kann.
Viele Grüße
ich spiele gerade mit der FadeTransition-Klasse von JavaFX herum und versuche dabei die Animation aus dem Film Matrix nachzubauen.
Bisher funktioniert alles soweit, allerdings möchte ich nach dem ein Durchlauf der Transition durchgelaufen ist, das verwendete Bild ändern. (Von 0 auf 1 und von 1 auf 0)
FadeTransition bietet die Methode setOnFinished an, welche allerdings nur ganz am Ende der Animation und nicht zwischen den einzelnen Durchläufen ausgeführt wird. (Damit funktioniert das ganze bei Infinite Loops gar nicht.
Hat jemand eine Idee, wie ich dieses Problem lösen/umgehen kann, und kann mir außerdem sagen, wie ich diesen Effekt ohne "Schlieren" von links nach rechts ermöglichen kann?
Mein Code:
Code:
GridPane matrix = new GridPane();
Image image0 = new Image("file:src/sample/0.png");
Image image1 = new Image("file:src/sample/1.png");
Random random = new Random();
ArrayList<ImageView>[] imageViews = new ArrayList[100];
for(int i = 0; i < 100; i++){
imageViews[i] = new ArrayList<ImageView>();
for(int j = 0; j < 100; j++){
if(random.nextBoolean()){
ImageView imageView1 = new ImageView(image1);
imageView1.setFitWidth(20);
imageView1.setFitHeight(20);
matrix.add(imageView1,i ,j );
imageViews[i].add(imageView1);
}
else {
ImageView imageView0 = new ImageView(image0);
imageView0.setFitWidth(20);
imageView0.setFitHeight(20);
matrix.add(imageView0,i ,j );
imageViews[i].add(imageView0);
}
}
}
for(int i = 0; i < imageViews.length; i++){
//Thread.sleep(10);
for(int j = 0; j < imageViews[0].size(); j++){
ImageView imageView = imageViews[i].get(j);
FadeTransition fadeTransition = new FadeTransition(Duration.seconds(0.5),imageView);
fadeTransition.setFromValue(1);
fadeTransition.setToValue(0);
fadeTransition.setOnFinished(event -> {
if(imageView.getImage().getUrl().equals("file:src/sample/0.png")){
imageView.setImage(image1);
} else{
imageView.setImage(image0);
}
});
fadeTransition.setDelay(Duration.millis(i*new Random().nextInt(250)));
fadeTransition.setCycleCount(Animation.INDEFINITE);
fadeTransition.setAutoReverse(true);
fadeTransition.play();
}
}
Scene scene = new Scene(matrix,1200,900);
primaryStage.setScene(scene);
Vielleicht habt ihr ja noch Verbesserungsvorschläge, wie ich das ganze eleganter lösen kann.
Viele Grüße