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

标签 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 个动画?

最佳答案

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.

您的代码应如下所示:

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.

这个例子解释了它是如何工作的:我们设置了一个 AnimatorSet 来播放:

  • anim1anim2 同时,
  • anim3anim2 完成时播放,
  • anim4anim3 完成时播放:

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

希望这对您有所帮助。

关于java - 如何使用 AnimatorSet 播放多个动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55681374/

相关文章:

augmented-reality - 如何在 ARKit 中获取 "light-invariant" `capturedImage`?

objective-c - AREnvironmentProbeAnchor 不存在于 ARFrame anchor 中

java - 如何处理ajax确认对话框是或否

java - spring mvc 中的服务层需要什么?推荐什么样的逻辑?

animation - UIView 动画闪烁与自动反转

java - CardView动画

android - Jetpack Compose "shortest"旋转动画

java - 如何在java中创建超链接?

java - 使用 java 通过 Mongo 连接池接收消息时超时

android - 如何将 Qualcoomm Vuforia 与基于位置的标记结合使用