如何使用顺序添加的动画重复动画集

时间:2015-06-09 12:51:32

标签: android android-animation

我正在尝试在Activity中制作动画,重复无限次。我已经在具有repeatCountrepeatMode属性的XML文件中尝试过它,但它不起作用。问题是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 个答案:

答案 0 :(得分:8)

为了它的价值,setRepeatMode()setRepeatCount()必须设置在Animation个对象上,而不是AnimationSet个对象上。这可能是你可能犯的错误。

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

另一种方法是按如下方式设置无休止的重复动画:

mAnimationSet.addListener(new AnimatorListenerAdapter() {

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

});
mAnimationSet.start();

答案 1 :(得分:0)

Y.S的答案似乎还可以,但即使我希望在某个时候取消动画,动画仍会继续进行。所以我这样做了:

DECLARE
  TYPE EmpCurTyp  IS REF CURSOR;
  v_emp_cursor    EmpCurTyp;
  emp_record      employees%ROWTYPE;
  v_stmt_str      VARCHAR2(200);
  v_e_job         employees.job%TYPE;
BEGIN
  -- Dynamic SQL statement with placeholder:
  v_stmt_str := 'SELECT * FROM employees WHERE job_id = :j';

  -- Open cursor & specify bind argument in USING clause:
  OPEN v_emp_cursor FOR v_stmt_str USING 'MANAGER';

  -- Fetch rows from result set one at a time:
  LOOP
    FETCH v_emp_cursor INTO emp_record;
    EXIT WHEN v_emp_cursor%NOTFOUND;
  END LOOP;

  -- Close cursor:
  CLOSE v_emp_cursor;
END;
/

更新:发现ktx有一些extension functions:我们可以消除样板过载,并使用以下方法:

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

因此,如果您只想要onEnd调用,则可以执行以下操作:

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

,而不是取消,而是使用animations.pause和animations.resume。