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中解决这个问题?
非常感谢!