如何重复一个AnimationSet并按顺序添加动画

8

我正在尝试在我的Activity中制作一个动画,要无限重复播放。我已经在XML文件中使用了repeatCountrepeatMode属性进行尝试,但是它并没有起作用。问题在于myanimation.xml文件由一组不同的动画构成。

我的该动画的XML文件:

<set
xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:interpolator="@android:anim/bounce_interpolator"
>



<translate


    android:startOffset="1000"
    android:fillAfter="true"
    android:fromXDelta="10"
    android:fromYDelta="10"
    android:toXDelta="50"
    android:toYDelta="-200"
    android:duration="1800"
    android:interpolator="@android:anim/bounce_interpolator"

    />



<translate

    android:fillAfter="true"
    android:startOffset="2000"
    android:fromYDelta="10"
    android:fromXDelta="10"
    android:toXDelta="100"
    android:toYDelta="270"
    android:duration="1800"
    android:interpolator="@android:anim/bounce_interpolator" />

<translate

    android:fillAfter="true"
    android:startOffset="3000"
    android:fromYDelta="10"
    android:fromXDelta="10"
    android:toXDelta="130"
    android:toYDelta="-270"
    android:duration="1800"
    android:interpolator="@android:anim/bounce_interpolator"
    />

<translate

    android:fillAfter="true"
    android:startOffset="4000"
    android:fromYDelta="10"
    android:fromXDelta="10"
    android:toXDelta="140"
    android:toYDelta="270"
    android:duration="1800"
    android:interpolator="@android:anim/bounce_interpolator"
    />

<translate

    android:fillAfter="true"
    android:startOffset="5000"
    android:fromYDelta="10"
    android:fromXDelta="10"
    android:toXDelta="90"
    android:toYDelta="-270"
    android:duration="1800"
    android:interpolator="@android:anim/bounce_interpolator"
    />

onCreate()方法中,我将动画绑定到了一个ImageView对象上。
    ImageView ball = (ImageView) findViewById(R.id.animationBall);
    final Animation myAnimation = AnimationUtils.loadAnimation(this,   R.anim.ball_animation);
    ball.startAnimation(myAnimation);

动画效果很好,唯一的问题是即使我设置了setRepeatMode()setRepeatCount()方法,它也不想重复播放。
2个回答

11

就我所知,setRepeatMode()setRepeatCount()必须在Animation对象上设置,而不是在AnimationSet对象上设置。那可能是你犯的错误。

因此,要么在Animation对象上调用这些方法,要么将这些属性添加到translate方案的XML中。

另一种方法是设置一个无限重复的动画,如下所示:

mAnimationSet.addListener(new AnimatorListenerAdapter() {

    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        mAnimationSet.start();
    }

});
mAnimationSet.start();

感谢第三种方法起作用了,我所需要做的就是实现AnimationListener。 - user3475581
7
这是一项工作。但我认为Google应该向AnimatorSet添加RepeatCount方法。 - Deni Erdyneev
看起来你不能用这种方式取消动画。它会无限循环。 - j2emanue
1
@j2emanue:我已经这么说了... :) 但是我也提到了另一种方法。 - Yash Sampat
为了解决这个问题,我们可以在Google问题跟踪器上投票,并要求AnimatorSet支持“repeatMode”和“repeatCount”XML属性。 - soshial

0

Y.S的回答似乎没问题,但是动画一直在进行,即使我想在某个时刻取消它。所以我做了这个:

 animations.playSequentially(
                objectAnimator1,objectAnimator2)



animations.addListener(object: Animator.AnimatorListener{
       var isCancelled = false
        override fun onAnimationRepeat(animation: Animator?) {
        }

        override fun onAnimationCancel(animation: Animator?) {
            isCancelled = true
        }

        override fun onAnimationStart(animation: Animator?) {
        }

        override fun onAnimationEnd(animation: Animator?) {
           if(isCancelled.not()) animations.start()
        }

    })
    animations.start()

更新:发现 ktx 有一些扩展函数:我们可以删除样板文件重载并使用它:

inline fun Animator.addListener(
    crossinline onEnd: (animator: Animator) -> Unit = {},
    crossinline onStart: (animator: Animator) -> Unit = {},
    crossinline onCancel: (animator: Animator) -> Unit = {},
    crossinline onRepeat: (animator: Animator) -> Unit = {})

这意味着如果你只想调用 onEnd,你可以像这样做:

 animations.addListener(onEnd = {animations.start() //loop forever })

而不是使用cancel,只需使用animations.pause和animations.resume。


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