问题
您的循环的迭代速度比动画可以播放的速度快。
代替循环,使用递归,利用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 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 。 如果index超过数组的长度,则返回/退出。
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);