java多个物体动画_java - 按顺序播放多个时间轴动画 - 堆栈内存溢出

问题

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

代替循环,使用递归,利用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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值