如何使用 AnimatorSet 播放多个动画? [英] How to play multiple Animations using AnimatorSet?

查看:36
本文介绍了如何使用 AnimatorSet 播放多个动画?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Sceneform 创建一个播放动画的 Android 应用程序.我正在尝试使用 AnimatorSet 依次启动多个 Animator.该代码在尝试播放两个动画时运行良好,但每当我添加第三个动画时,前两个动画都会播放,然后应用程序崩溃.

这是一段代码:

 ListanimatorList = new ArrayList();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 个动画?

解决方案

AnimatorSet 公共类,它扩展了 Animator 类,提供了一种将动画组合在一起的机制,以便它们彼此相关地运行.您可以将动画设置为同时顺序在指定延迟后播放.

您的代码应如下所示:

AnimatorSetbouncer = new AnimatorSet();bouncer.play(bounceAnim).before(squashAnim1);//这四个动画同时播放弹跳器.play(squashAnim1).with(squashAnim2);弹跳器.play(squashAnim1).with(stretchAnim1);弹跳器.play(squashAnim1).with(stretchAnim2);bouncer.play(bounceBackAnim).after(stretchAnim2);ValueAnimatorfadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);淡出动画.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.他们可以在动画的持续时间内监听重要的事件.代码如下所示:

ValueAnimatorfadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);淡出动画.setDuration(250);淡入淡出.addListener(新的AnimatorListenerAdapter(){公共无效 onAnimationEnd(动画师动画){balls.remove(((ObjectAnimator)animation).getTarget());}}

希望这会有所帮助.

I'm using Sceneform to create an android app that plays animation. I'm trying to start multiple Animators sequentially using AnimatorSet. The code works perfectly when trying to play two animations, but whenever I add a 3rd animation, the first two animations play then the app crashes.

Here's a piece of the code:

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

How can I let it play more than just 2 animations?

解决方案

AnimatorSet public class, which extends Animator class, provides a mechanism to group animations together so that they run in relation to one another. You can set animations to play simultaneously, sequentially, or after a specified delay.

Here's how your code should look like:

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

In this code squashAnim1 clip plays simultaneously with squashAnim2, stretchAnim1, and stretchAnim2.

And this example explains how it works: we set up an AnimatorSet to play:

  • anim1 and anim2 at the same time,
  • anim3 to play when anim2 finishes,
  • and anim4 to play when anim3 finishes:

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

Also, you might use Animation listeners. They can listen for important events during an animation's duration. Here's a code how it looks like:

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

Hope this helps.

这篇关于如何使用 AnimatorSet 播放多个动画?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆