我已经看过How to wait for a transition to end in javafx 2.1?,但它并没有完全解决我的问题。
我有一个ImageView对象列表,我想迭代这个List并在List的每个'slide'上执行以下操作:
我有以下代码,但由于转换是异步的,因此循环同时应用转换到所有'幻灯片':
// 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,所以我不想对它进行硬编码)。感谢。
答案 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();
}
}