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

标签 java animation timeline

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

如果 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/

相关文章:

java - 尝试使用 Paho 客户端 MqttCallback 在 messageArrived() 中发布

java - 从 java web 应用程序轮询数据库表更新的最佳方法

Java if else 部分匹配

ios - 缩小单元格框架与放大框架不同

java - onActivityResult() 未使用两个 fragment 调用

android - 用户滚动时如何在工具栏中为 View 设置动画?

javascript - HTML5 时间轴、甘特图控件

jquery - 每次单击按钮时向右/向左移动

css - 将 AM 和 PM 包裹在等间距的 <td> 中

c# - Windows Phone 7 上的 UV 纹理偏移动画