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

时间:2019-04-15 00:50:22

标签: java animation augmented-reality arcore sceneform

我正在使用Sceneform创建一个播放动画的android应用。我正在尝试使用AnimatorSet顺序启动多个Animator。尝试播放两个动画时,代码可以完美运行,但是每当我添加第三个动画时,前两个动画就会播放,然后应用崩溃。

下面是一段代码:

    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();

如何让它播放不止2个动画?

1 个答案:

答案 0 :(得分:1)

  

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同时
  • anim3anim2完成后播放,
  • anim4anim3完成时播放:

    AnimatorSet clips = new AnimatorSet();
    clips.play(anim1).with(anim2);
    clips.play(anim2).before(anim3);
    clips.play(anim4).after(anim3);
    

此外,您可以使用Animation listeners。他们可以在动画期间收听重要事件。这是一个看起来像这样的代码:

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());
    }
}

希望这会有所帮助。