如何按顺序播放路径转换?

时间:2015-02-21 05:57:22

标签: javafx sequence transition

JavaFX中是否有一种特殊的方式(某种事件/转换队列?),您可以使用它来按顺序播放动画/转换?

在最后的纸牌游戏中,卡片通常已经按顺序排列(K-> -Q-> J-10-> -9-> ...)并且我想自动完成它们。因此,第一张牌9必须从画面移动到基础,然后是10,然后是J等等。

我想在转换队列中进行路径转换,而不是一次完成。

我无法使用SequentialTranstition,因为动画播放后您无法修改其子项。

  

public final ObservableList getChildren()

     

将按顺序播放的动画列表。

     

无法更改跑步的孩子   SequentialTransition。如果孩子们因为跑步而改变了   SequentialTransition,动画必须停止并启动   再次拿起新的价值。

使用这个最小的例子可以验证:

public class PathTransitionDemo extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        Group root = new Group();

        List<Rectangle> rectangles = new ArrayList<>();

        double w = 50;
        double h = 50;
        double spacing = 10;

        for( int i=0; i < 10; i++) {

            Rectangle rectangle = new Rectangle ( spacing * (i+1) + w * i, 50, w, h);
            rectangle.setStroke( Color.BLUE);
            rectangle.setFill( Color.BLUE.deriveColor(1, 1, 1, 0.2));
            rectangles.add( rectangle);

        }

        root.getChildren().addAll( rectangles);

        primaryStage.setScene(new Scene(root, 1024, 768));
        primaryStage.show();

        // transition

        SequentialTransition seq = new SequentialTransition();

        for( Rectangle rectangle: rectangles) {

            Path path = new Path();
            path.getElements().add (new MoveTo ( rectangle.getX(), rectangle.getY()));
            path.getElements().add (new LineTo( 900, 600));

            PathTransition pathTransition = new PathTransition();
            pathTransition.setDuration(Duration.millis(1000));
            pathTransition.setNode(rectangle);
            pathTransition.setPath(path);

            //pathTransition.play();

            seq.getChildren().add( pathTransition);

            if( seq.getStatus() != Status.RUNNING)
                seq.play();
        }

//        seq.play();

    }
}

顺序转换在播放第一个路径转换后停止。

解决方案是修改PathTransitions的setOnFinished处理程序。但那很难看。并且它只能在另一个之后播放exaclty 1 transtition。我们假设一张卡过渡持续2000毫秒,即e。 G。限制在500毫秒内开始另一个队列转换的可能性。

我创建的Video Wall中的动画有类似的要求。在那里我用AnimationTimer解决了它。摘自代码:

AnimationTimer timer = new AnimationTimer() {

            long last = 0;

            @Override
            public void handle(long now) {

                if( (now - last) >   40_000_000) 
                {
                    if( transitionList.size() > 0) {

                        ParallelTransition t = transitionList.remove(0);
                        t.getNode().setVisible(true);
                        t.play();

                    }
                    last = now;

                }

                if( transitionList.size() == 0) {
                    stop();
                }
            }

        };

有没有更好的方法在JavaFX中解决这个问题?

非常感谢!

0 个答案:

没有答案