重复播放AnimatorSet动画多次

9

我已经尝试了好几个小时,感觉现在是放弃的时候了。如何循环播放在xml中定义的AnimatorSet?

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <objectAnimator />

    <objectAnimator />

    <objectAnimator />

    <objectAnimator />

</set>

我尝试了许多startOffsetrepeatCountduration的组合,但这不是正确的方法。我阅读了关于这个有希望的解决办法。
a.addListener(new AnimatorListenerAdapter() {

    @Override
    public void onAnimationEnd(Animator animation) {
        animation.start();
        Log.i();
    }
});

但是它就是不起作用:onAnimationEnd只被调用一次,动画重复播放,然后onAnimationEnd不再被调用。
这里的其他类似问题涉及错误答案(指android.view.animation框架)或建议为单个objectAnimator定义自定义插值器,但这并不是我要找的。谢谢。
3个回答

5
我曾遇到一个问题,使用 AnimatorSet 播放两个动画时发生了错误。
我使用 animationSet.play(anim1).with(anim2) 创建了这个集合,结果我的动画只重复了一次。
将其更改为 animationSet.play(anim1).with(anim2).after(0) 解决了我的问题,并允许动画无限循环。
似乎有一个错误会强制你在动画中至少有一个顺序步骤,才能使动画循环多次。

1
我没有时间再测试了,我会相信你的。 :-) - natario
你救了我的一天,不知道为什么 animatorSet.playTogether 在真实设备上不能正常工作。 - Phong Nguyen
首先我使用了animatorSet.playSequentially,它可以无限循环,但是后来我意识到我不需要两个动画,于是尝试了animatorSet.play,但是像你所描述的那样只循环了一次。对我来说,使用animatorSet.play(anim1).after(0)可以让我只播放一次动画。 - Bruno Bieri

3
我遇到了完全相同的情况。经过一天近乎试验后,我突然怀疑动画师应该在主线程上启动。这样做是有效的。
mRandomPointAnimatorSet.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStart(Animator animation) {
            Log.i(TAG, "onAnimationStart");
            mRandomPointView.setVisibility(VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            Log.i(TAG, "onAnimationEnd");
            mRandomPointView.setVisibility(INVISIBLE);
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (isShown()) {
                        requestLayout();
                        mRandomPointAnimatorSet.start();
                    }
                }
            });
        }
    });

目前我不知道为什么。


我想你应该提醒注意使用主线程创建 mHandler。就像这样:Handler mHandler = new Handler(context.getMainLooper());,如此描述在这里:https://dev59.com/gmgu5IYBdhLWcg3wuJSF#11125271/ - Bruno Bieri

0

当您将动画作为递归重启时,您没有向其添加监听器。您需要创建一个AnimatorListenerAdapter对象并重复使用它。

希望我对您有所帮助!


我尝试调用a.start()而不是animation.start(),但是我得到了相同的行为,所以我认为那不是问题。会再试一次! - natario
我刚刚创建了一个AnimatorListenerAdapter对象,将其添加为监听器并启动。在监听器内部,我尝试调用animation.start()以及a.start()(我的最终AnimatorSet),还尝试在最后添加监听器。结果:onAnimationEnd只会被触发一次。 - natario
首先,你需要相信你的IDE没有对你怀恨在心,无论你尝试过什么都是错误的,你需要一种新的方法。 - Parth Kapoor

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