как повернуть слайдер изображений javafx после его завершения - PullRequest
0 голосов
/ 21 марта 2020

У меня есть список изображений, и я не могу воспроизвести их в обратном порядке, сначала он прокручивается справа налево, а затем автоматически поворачивается слева направо. Таким образом, я могу воспроизвести первую анимацию, затем воспроизвести 2-ю анимацию, затем воспроизвести 2-ю анимацию назад и достичь положения, как после воспроизведения только первой анимации.
1

Моя проблема в том, что я не могу повернуть анимацию после ее завершения. Я знаю, что могу установить autoReverse, но тогда каждая анимация будет сразу же изменяться.

package com.valid;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.animation.TranslateTransition;
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 Only extends Application {
    class SimpleSlideShow {

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

        public SimpleSlideShow() {
            this.slides = new ImageView[4];
            Image image1 = new Image(Only.class.getResource("res/Pic1.jpg").toExternalForm());
            Image image2 = new Image(Only.class.getResource("res/Pic2.jpeg").toExternalForm());
            Image image3 = new Image(Only.class.getResource("res/Pic3.jpeg").toExternalForm());
            Image image4 = new Image(Only.class.getResource("res/Pic4.jpeg").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;
        }

        public ImageView[] getImageView() {
            return slides;
        }

        public void start() {

            this.root.getChildren().add(slides[0]);
            // slide.setOpacity(0);
            Timeline timeline = new Timeline();
            List<Animation> anm = new ArrayList<>(4);
            for (int i = 0; i < slides.length; i++) {
                TranslateTransition tts = new TranslateTransition(Duration.millis(3000));
                anm.add(tts);
                int dam= i >> 1;
                if ((i & 1)==0) {
                    tts.setFromY(dam*10);
                    tts.setToY((dam+1)*10);
                } else {
                   tts.setFromX(dam*10);
                   tts.setToX((dam+1)*10);
                }
            }
            KeyValue kv = new KeyValue(slides[0].translateXProperty(), 0, Interpolator.EASE_IN);
            KeyFrame kf = new KeyFrame(Duration.seconds(2), kv);
            timeline.getKeyFrames().add(kf);
            timeline.setAutoReverse(true);
            timeline.setOnFinished(t -> {
                this.root.getChildren().addAll(slides[1], slides[2], slides[3]);
            });
            timeline.play();
        }

        public FadeTransition getFadeTransition(ImageView imageView, double fromValue, double toValue,
                int durationInMilliseconds) {
            // SequentialTransition slide = new SequentialTransition();
            // slide.setCycleCount(2);
            // slide.autoReverseProperty();
            // slide.setAutoReverse(true);
            FadeTransition ft = new FadeTransition(Duration.seconds(3), 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.setMaximized(true);
        primaryStage.show();
        simpleSlideShow.getImageView()[0].translateXProperty().set(scene.getWidth());
        simpleSlideShow.start();
    }

}

Я хочу, чтобы мои слайды менялись автоматически после скольжения, но мой код не работает должным образом

...