在JavaFX中按顺序转换ImageView

时间:2013-07-08 21:41:14

标签: java design-patterns javafx-2 javafx

我已经看过How to wait for a transition to end in javafx 2.1?,但它并没有完全解决我的问题。

我有一个ImageView对象列表,我想迭代这个List并在List的每个'slide'上执行以下操作:

  1. 淡入
  2. 停留几秒钟
  3. 淡出
  4. 我有以下代码,但由于转换是异步的,因此循环同时应用转换到所有'幻灯片':

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

    关于如何逐个动画这些ImageView对象列表的任何想法(无论列表上有多少个ImageView,所以我不想对它进行硬编码)。感谢。

1 个答案:

答案 0 :(得分:4)

因此,对此的一个明显的解决方法是使用周围的SequentialTransition为您的SequentialTransition播放那些Transitions,顺序而不是一次性完成所有:

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

其次,你应该使用PauseTransition而不是内插从1.0到1.0的FadeTransition。

这个的完整示例应用程序可能如下所示:

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