我正在尝试在Activity
中制作动画,重复无限次。我已经在具有repeatCount
和repeatMode
属性的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()
方法。
答案 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。