2013-07-08 2 views
5

Übergang zu übergehen, habe ich schon How to wait for a transition to end in javafx 2.1? betrachtet, aber es löst nicht ganz mein Problem.Um auf ImageView in JavaFX

Ich habe eine Liste der Image Objekte, und ich möchte durch diese Liste zu durchlaufen und die folgenden Aktionen auf jedem ‚slide‘ der Liste durchführen:

  1. verblassen in
  2. Aufenthalt für ein paar Sekunden
  3. verblassen

I habe die folgenden Code anstelle aus, aber da der Übergang asynchron ist, gilt die Schleife um den Übergang zu allen ‚Folien‘ zur gleichen Zeit:

// The method I am running in my class 

public void start() { 

    for (ImageView slide : slides) { 

     SequentialTransition sequentialTransition = new SequentialTransition(); 

     FadeTransition fadeIn = Transition.getFadeTransition(slide, 0.0, 1.0, 2000); 
     FadeTransition stayOn = Transition.getFadeTransition(slide, 1.0, 1.0, 2000); 
     FadeTransition fadeOut = Transition.getFadeTransition(slide, 1.0, 0.0, 2000); 

     sequentialTransition.getChildren().addAll(fadeIn, stayOn, fadeOut);    
     this.root.getChildren().add(slide);    
     sequentialTransition.play(); 

    } 
} 

// the method in the Transition helper class: 

public static FadeTransition getFadeTransition(ImageView imageView, double fromValue, double toValue, int durationInMilliseconds) { 

    FadeTransition ft = new FadeTransition(Duration.millis(durationInMilliseconds), imageView); 
    ft.setFromValue(fromValue); 
    ft.setToValue(toValue); 

    return ft; 

} 

Irgendwelche Ideen auf, wie ich diese Liste der Image eins nach dem anderen Objekte animieren kann (unabhängig von der Anzahl der ImageViews dort auf der Liste sind, so will ich nicht zu hart Code it). Vielen Dank.

Antwort

4

Also, der obivous fix dies wäre eine umgebende SequentialTransition für Ihre SequentialTransitions zu verwenden, die diese Übergänge spielen, na ja, nacheinander statt alle auf einmal:

public void start() { 

    SequentialTransition slideshow = new SequentialTransition(); 

    for (ImageView slide : slides) { 

     SequentialTransition sequentialTransition = new SequentialTransition(); 

     FadeTransition fadeIn = Transition.getFadeTransition(slide, 0.0, 1.0, 2000); 
     FadeTransition stayOn = Transition.getFadeTransition(slide, 1.0, 1.0, 2000); 
     FadeTransition fadeOut = Transition.getFadeTransition(slide, 1.0, 0.0, 2000); 

     sequentialTransition.getChildren().addAll(fadeIn, stayOn, fadeOut);    
     this.root.getChildren().add(slide);    
     slideshow.getChildren().add(sequentialTransition); 

    } 
    slideshow.play(); 
} 

Zweitens sollten Sie PauseTransition anstelle von eine FadeTransition, die zwischen 1.0 und 1.0 interpoliert.

package slideshow; 

import javafx.animation.FadeTransition; 
import javafx.animation.PauseTransition; 
import javafx.animation.SequentialTransition; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class SimpleSlideShowTest extends Application{ 

    class SimpleSlideShow { 

    StackPane root = new StackPane(); 
    ImageView[] slides; 

    public SimpleSlideShow() { 
     this.slides = new ImageView[4]; 
     Image image1 = new Image(SlideShowTest.class.getResource("pic1").toExternalForm()); 
     Image image2 = new Image(SlideShowTest.class.getResource("pic2").toExternalForm()); 
     Image image3 = new Image(SlideShowTest.class.getResource("pic3").toExternalForm()); 
     Image image4 = new Image(SlideShowTest.class.getResource("pic4").toExternalForm()); 
     slides[0] = new ImageView(image1); 
     slides[1] = new ImageView(image2); 
     slides[2] = new ImageView(image3); 
     slides[3] = new ImageView(image4); 

    } 

    public StackPane getRoot() { 
     return root; 
    } 

    // The method I am running in my class 

    public void start() { 

     SequentialTransition slideshow = new SequentialTransition(); 

     for (ImageView slide : slides) { 

     SequentialTransition sequentialTransition = new SequentialTransition(); 

     FadeTransition fadeIn = getFadeTransition(slide, 0.0, 1.0, 2000); 
     PauseTransition stayOn = new PauseTransition(Duration.millis(2000)); 
     FadeTransition fadeOut = getFadeTransition(slide, 1.0, 0.0, 2000); 

     sequentialTransition.getChildren().addAll(fadeIn, stayOn, fadeOut); 
     slide.setOpacity(0); 
     this.root.getChildren().add(slide); 
     slideshow.getChildren().add(sequentialTransition); 

     } 
     slideshow.play(); 
    } 

// the method in the Transition helper class: 

    public FadeTransition getFadeTransition(ImageView imageView, double fromValue, double toValue, int durationInMilliseconds) { 

     FadeTransition ft = new FadeTransition(Duration.millis(durationInMilliseconds), imageView); 
     ft.setFromValue(fromValue); 
     ft.setToValue(toValue); 

     return ft; 

    } 
    } 

    public static void main(String[] args) { 
    launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
    SimpleSlideShow simpleSlideShow = new SimpleSlideShow(); 
    Scene scene = new Scene(simpleSlideShow.getRoot()); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    simpleSlideShow.start(); 
    } 
} 
+0

Dank Sebastian:

Eine vollständige Beispielanwendung dafür könnte wie folgt aussehen! :) Ich habe das nicht versucht (werde tun, wenn ich nach Hause komme), aber es macht Sinn lol .. ich bin so dumm .. vielen Dank! :) Ich werde dich aktualisieren, sobald ich nach Hause komme. –

+0

Kein Problem. Wenn ich hinzufügen möchte, würde ich lieber Timer und TimerTask verwenden, um die nächsten Folien außer JavaFX auszulösen, da dies viel besser skaliert. Ich habe vor ein paar Wochen eine Diashow für mich selbst geschrieben, und das Hinzufügen von Schaltflächen und/oder das Stoppen der Diashow ist etwas, was Sie später Ihrer Anwendung hinzufügen möchten. – Sebastian

+0

Hallo Bastian, ich habe die von dir vorgeschlagene Lösung ausprobiert und leider funktioniert es nicht ganz. Wenn ich den Code ausführe, sehe ich nur die letzte Folie in der Liste. Sie wird vorne angezeigt und dann blendet sie sich ein und wird ausgeblendet, wobei der Bildschirm leer bleibt. Ich denke, ich muss den Übergang für jede Folie spielen, die hier nicht passiert .. irgendwelche Ideen? Vielen Dank :) –