2013-07-08 10 views
5

Już patrzyłem na How to wait for a transition to end in javafx 2.1?, ale to nie do końca rozwiązuje mój problem.W celu przejścia na ImageView w JavaFX

Mam listę obiektów ImageView i chcę wykonać iterację tej listy i wykonaj następujące czynności na każdym „slide” listy:

  1. Fade In
  2. pobyt przez kilka sekund
  3. zanikanie

mam następujący kod w miejscu, ale od czasu przejścia jest asynchroniczna, pętla dotyczy przejścia do wszystkich „slajdy” w tym samym czasie:

// 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; 

} 

Wszelkie pomysły, w jaki sposób można animować te Lista ImageView obiekty pojedynczo (niezależnie od liczby ImageViews nie znajdują się na liście, więc nie chcą ciężko kodem niego). Dzięki.

Odpowiedz

4

Tak, obivous fix do tego byłoby użyć otaczającą SequentialTransition dla swoich SequentialTransitions który odtwarza te przejścia, dobrze, kolejno zamiast wszystkich naraz:

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

drugie, należy użyć PauseTransition zamiast a FadeTransition, który interpoluje od 1,0 do 1,0.

Pełną Przykładem zastosowania może to wyglądać tak:

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

Dzięki Sebastian! :) Nie próbowałem tego (zrobię kiedy dostanę się do domu), ale ma sens lol .. jestem taki głupi .. dziękuję bardzo! :) Będę aktualizował, gdy tylko dotrę do domu .. –

+0

Bez problemu. Jeśli mógłbym dodać, wolałbym używać Timera i TimerTask, aby wyzwalać kolejne slajdy poza JavaFX, ponieważ skaluje się to znacznie lepiej. Kilka tygodni temu napisałem sam pokaz slajdów, a dodanie przycisków i lub zatrzymanie pokazu slajdów to coś, co możesz dodać później do swojej aplikacji. – Sebastian

+0

Cześć Bastian, próbowałem rozwiązania, które zasugerowałeś i niestety to nie wystarczy. Kiedy uruchamiam kod, widzę tylko ostatni slajd na liście ... pokazuje się z przodu, a następnie znika i zanika, pozostawiając ekran pusty. Myślę, że muszę zagrać w przejście dla każdego slajdu, który się tutaj nie dzieje .. jakieś pomysły? Wielkie dzięki: –