【问题标题】:In order transition on ImageView in JavaFX为了在 JavaFX 中的 ImageView 上进行转换
【发布时间】:2013-07-08 21:41:13
【问题描述】:

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

我有一个 ImageView 对象列表,我想遍历此列表并在列表的每个“幻灯片”上执行以下操作:

  1. 淡入
  2. 停留几秒钟
  3. 淡出

我有以下代码,但由于过渡是异步的,因此循环将过渡同时应用于所有“幻灯片”:

// 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 数量无关,因此我不想对其进行硬编码)。谢谢。

【问题讨论】:

    标签: java design-patterns javafx-2 javafx


    【解决方案1】:

    因此,对此的明显解决方法是为您的 SequentialTransition 使用环绕的 SequentialTransition 来播放这些转换,嗯,顺序而不是一次全部播放:

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

    【讨论】:

    • 感谢塞巴斯蒂安! :) 我还没有尝试过(我回家后会这样做),但这是有道理的,哈哈……我太愚蠢了……非常感谢! :) 我回家后会更新你..
    • 没问题。如果我可以添加,我宁愿使用 Timer 和 TimerTask 来触发除 JavaFX 之外的下一张幻灯片,因为这样可以更好地扩展。几周前我为自己写了一个幻灯片,添加按钮和/或停止幻灯片是您以后可能想要添加到应用程序中的内容。
    • 嗨,巴斯蒂安,我尝试了您建议的解决方案,但不幸的是,它并不能完全奏效。当我运行代码时,我只看到列表中的最后一张幻灯片.. 它显示在前面,然后淡入淡出,使屏幕变为空白。我想我需要为这里没有发生的每张幻灯片播放过渡..有什么想法吗?非常感谢:)
    • @SoftwareGuy:我不知道你错过了什么,但我发布了一个完整的例子来展示幻灯片。注意每张幻灯片的setOpacity(0)。
    • Awesssomeee @Sebastian :) slide.setOpacity(0);是丢失的一块!谢谢百万人!你摇滚!
    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多