在javafx中的组中一次应用转换到一个节点

时间:2015-03-12 23:59:48

标签: animation javafx transition javafx-8 timeline

我试图在javafx中一次淡入一个对象。我试图使用for循环来遍历组的节点,但是组中的所有节点似乎同时显示而不是一次淡入。我似乎无法弄清楚问题出在哪里。

    Group points = new Group();

        for(int i = 0; i < ipSize; i++){
            double xCentre = ipXPoints[i]-5;
            double yCentre = ipYPoints[i]-5;

            Circle point = new Circle(xCentre , yCentre, 10, Color.FORESTGREEN);
            points.getChildren().add(point);
        }
pane.getChildren().add(points);

Timeline timeline = new Timeline();
        for(Node node: pane.getChildren()){
            timeline.getKeyFrames().addAll(
                    new KeyFrame(Duration.seconds(0), // set start position at 0
                        new KeyValue(node.opacityProperty(), 0, Interpolator.EASE_BOTH)
                    ),
                    new KeyFrame(Duration.seconds(3), 
                        new KeyValue(node.opacityProperty(), 1, Interpolator.EASE_BOTH)
                    )
                );
timeline.play();
}

编辑: 我也试过这个,但它一直在播放所有节点,而不是一次播放所有节点。

FadeTransition fade = new FadeTransition(Duration.seconds(3), node);
            fade.setFromValue(0);
            fade.setToValue(1);
            fade.setAutoReverse(false);
            fade.setCycleCount(1);
            fade.setInterpolator(Interpolator.EASE_BOTH);
            fade.play();

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

同时显示所有圈子的原因是KeyFrame持续时间实际上不是帧的持续时间,而是从动画开始的绝对持续时间。因此,您指定所有转换发生在0和3之间。要修复你的代码,你需要将第一对KeyFrame持续时间设置为0s和3s,第二对设置为3s和6s,第三对设置为6s和9s等等。

或者,您可以SequentialTransition使用FadeTransitions

import java.util.Random;

import javafx.animation.FadeTransition;
import javafx.animation.SequentialTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;


public class SequentialFadeIn extends Application {

    @Override
    public void start(Stage stage) {
        int width = 600;
        int height = 400;

        Group points = new Group();
        SequentialTransition seq = new SequentialTransition();
        Random random = new Random();
        for(int i = 0; i < 10; i++){
            double xCentre = random.nextInt(width);
            double yCentre = random.nextInt(height);

            Circle point = new Circle(xCentre , yCentre, 10, Color.FORESTGREEN);
            point.setOpacity(0.0);

            points.getChildren().add(point);
            FadeTransition fade = new FadeTransition(Duration.seconds(3), point);
            fade.setToValue(1.0);
            seq.getChildren().add(fade);
        }

        stage.setScene(new Scene(points, width, height));
        stage.show();
        seq.play();
    }

    public static void main(String[] args) {
        launch(args);
    }
}