如何使用 AnimatorSet 播放多个动画? [英] How to play multiple Animations using 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
剪辑与 squashAnim2
、stretchAnim1
和 stretchAnim2
同时播放.
这个例子解释了它是如何工作的:我们设置了一个 AnimatorSet
来播放:
anim1
和anim2
同时,anim3
在anim2
结束时播放,和
anim4
在anim3
结束时播放: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 extendsAnimator
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 withsquashAnim2
,stretchAnim1
, andstretchAnim2
.
And this example explains how it works: we set up an AnimatorSet
to play:
anim1
andanim2
at the same time,anim3
to play whenanim2
finishes,and
anim4
to play whenanim3
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屋!