如何使用AnimatorSet播放多个动画?

3

我正在使用 Sceneform 创建一个安卓应用程序,播放动画。我想使用 AnimatorSet 顺序地开始多个动画,当尝试播放两个动画时,代码可以完美运行,但是每当我添加第三个动画时,前两个动画会播放,然后应用程序崩溃。

以下是部分代码:

    List<Animator> animatorList = new ArrayList<Animator>();

    AnimationData ad1 = JimRenderable.getAnimationData("Abm_09|A");

    Animator a = new ModelAnimator(ad1, JimRenderable);
    animatorList.add(a);

    AnimationData ad2 = JimRenderable.getAnimationData("Abm_09|B");

    a = new ModelAnimator(ad2, JimRenderable);
    animatorList.add(a);

    AnimationData ad3 = JimRenderable.getAnimationData("Abm_09|C");

    a = new ModelAnimator(ad3, JimRenderable);
    animatorList.add(a);

    AnimatorSet as= new AnimatorSet();
    as.playSequentially(animatorList);
    as.start();

我该如何让它播放超过两个动画?
1个回答

0

AnimatorSet 是一个公共类,它扩展了 Animator 类,提供了一种将动画组合在一起以便它们相互关联运行的机制。您可以设置动画同时播放、按顺序播放或在指定延迟后播放。

以下是您的代码应该如何编写:

AnimatorSet bouncer = new AnimatorSet();

bouncer.play(bounceAnim).before(squashAnim1);

// THESE FOUR ANIMATIONS PLAY SIMULTANEOUSLY
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);

bouncer.play(bounceBackAnim).after(stretchAnim2);

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);

animatorSet.start();

在这段代码中,squashAnim1剪辑与squashAnim2stretchAnim1stretchAnim2同时播放。

而这个示例解释了它的工作原理:我们设置了一个AnimatorSet来播放:

  • 同时播放anim1anim2
  • anim2完成后播放anim3
  • anim3完成后播放anim4:

    AnimatorSet clips = new AnimatorSet();
    clips.play(anim1).with(anim2);
    clips.play(anim2).before(anim3);
    clips.play(anim4).after(anim3);
    
此外,您可能会使用“动画监听器”。它们可以在动画持续时间内侦听重要事件。以下是代码示例:
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);

fadeAnim.addListener(new AnimatorListenerAdapter() {
    public void onAnimationEnd(Animator animation) {
        balls.remove(((ObjectAnimator)animation).getTarget());
    }
}

希望这能有所帮助。

谢谢您的回复。我尝试使用.play()和.with()/after,但是仍然出现了同样的问题。两个动画可以顺序播放得很好。但是每当我添加第三个动画时,程序就会播放前两个动画,然后崩溃。 - Jim
尽量不要使用数组。将每个片段作为单独的元素使用。 - Andy Jazz
尝试过了,结果还是一样。我创建了3个Animator对象a1、a2、a3。然后我使用了: as.playSequentially(a1,a2,a3); 程序在播放a1和a2后崩溃了。我还尝试使用: as.play(a1).before(a2); as.play(a2).before(a3); 但仍然得到相同的结果。 我似乎找不到问题所在。两个动画播放正常,但第三个却导致应用程序崩溃,这真的没有道理。 - Jim
我认为这不是AnimatorSet()的问题。有一个错误。你需要以某种方式进行调试。 - Andy Jazz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接