gpt4 book ai didi

java - 按顺序播放多个时间轴动画

转载 作者:行者123 更新时间:2023-12-01 19:36:44 26 4
gpt4 key购买 nike

我正在尝试通过列表播放搜索,如果该列表包含关键字单词,它将播放该动画。

如果 myList 包含{"Cloudy","Cloudy,"Cloudy","Clear"}它应该播放 cloudyT 动画并循环 3 次,然后播放 ClearT 动画。但那不是 Actor 阵容。我注意到它同时执行所有 4 个动画,导致只显示一个动画。我的 setCycleCount 对于所有这些都是相同的。

我还注意到,与动画完成之前一次性打印相比,打印语句将一次性打印所有内容,这意味着它不会等待动画完成。

for (int i = 0; i < time.length;i++) {  
if (myList.get(i).equals("Cloudy")) {
System.out.println("Cloudy found");
cloudyGrp.setVisible(true); //Group
cloudyT.setRate(.5); //Timeline
cloudyT.play();
cloudyT.setOnFinished(event -> {
cloudyGrp.setVisible(false);
System.out.println("Cloudy animation done");
});
}
if (myList.get(i).equals("Clear")) {
clearGrp.setVisible(true); //Group
clearT.setRate(.5);
clearT.play(); //Timeline
clearT.setOnFinished(event -> {
clearGrp.setVisible(false);
System.out.println("Clear animation done");
});
}
//other if statement with same layout

我如何将它们分开,以便它们一个接一个地单独播放?

我想过使用线程并使用优先级,但不知道如何实现它。谢谢。

最佳答案

问题

循环的迭代速度比动画的播放速度快。

使用递归代替循环,利用 setOnFinished 触发数组中的下一个动画。

<小时/>

解决方案

引入新类型

当动画开始时,该组应该可见。当动画停止时,该组应该被隐藏。

新类型会将动画与其可显示组分组:

class AnimationWrapper {
private Animation animation;
private Group group;

public AnimationWrapper(Animation animation, Group group) {
this.animation = animation;
this.group = group;
}
}

这种新类型将通过某种 play 方法处理动画的播放以及组的隐藏/显示。

AnimationWrapper#play 方法将接受动画完成时的回调函数。

class AnimationWrapper {
// ...

public void play(Runnable onFinished) {
group.setVisible(true);
animation.setOnFinished(e -> {
group.setVisible(false);
onFinished.run();
});

animation.setRate(.5);
animation.play();
}
}

String值映射到其相关的AnimationWrapper

最终目标是引入一个简单的界面:“根据此 String 数组中的值播放动画。

最初具有循环的类将引入一个 Map 字段:

Map<String, AnimationWrapper> animations = new HashMap<>();

// populate somewhere
animations.put("Cloudy", new AnimationWrapper(cloudyT, cloudyGroup);

在处理String[]请求时,Map可以让您轻松抓取动画。

使用递归

目标是执行:

play > onFinished > play > onFinished > ...`

此模式应该持续下去,直到您用完请求数组中的所有 String 值。

在带有 Map 的类中,我们将声明一个 play(String[]) ,它将处理播放数组请求的动画。

void play(String[] items) {
play(items, 0);
}

void play(String[] items, int index) {
// TODO
}

引入重载将使我们能够跟踪方法调用之间的索引。

在重载方法中,您首先检查是否 index >= items.length。如果索引超过数组的长度,则返回/退出。

void play(String[] items, int index) {
if(index >= items.length)
return;
}

如果索引不超过,我们将使用它来获取请求的动画,并使用请求从Map访问动画包装器:

void play(String[] items, int index) {
if(index >= items.length)
return;

String requestedAnim = items[index];
AnimationWrapper anim = animations.get(requestedAnim);
}

一旦你有了动画,就可以播放它。完成后,使用下一个索引调用 play

void play(String[] items, int index) {
if(index >= items.length)
return;

String requestedAnim = items[index];
AnimationWrapper anim = animations.get(requestedAnim);
anim.play(() -> play(items, index + 1));
}

您最初有循环的地方,现在可以调用:

String[] requests = { "Cloudy", "Cloudy", "Cloudy", "Clear" };
play(requests);

关于java - 按顺序播放多个时间轴动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57175900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com