我正在尝试通过列表播放搜索,如果该列表包含关键字
单词,它将播放该动画。
如果 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/