我正在屏幕上做一个气泡动画,但是在完成动画时间后气泡停止了。如何重复动画或使其无限?
bub.animate();
bub.animate().x(x2).y(y2);
bub.animate().setDuration(animationTime);
bub.animate().setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
animators.add(animation);
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
});
答案 0 :(得分:12)
由于ViewPropertyAnimator
仅适用于简单的动画,因此请使用更高级的ObjectAnimator
类 - 基本上是方法setRepeatCount,另外还有setRepeatMode。
答案 1 :(得分:7)
这实际上是可行的。以下是旋转视图的示例:
final ViewPropertyAnimator animator = view.animate().rotation(360).setInterpolator(new LinearInterpolator()).setDuration(1000);
animator.setListener(new android.animation.Animator.AnimatorListener() {
...
@Override
public void onAnimationEnd(final android.animation.Animator animation) {
animation.setListener(null);
view.setRotation(0);
view.animate().rotation(360).setInterpolator(new LinearInterpolator()).setDuration(1000).setListener(this).start();
}
});
您还可以使用" withEndAction"而不是听众。
答案 2 :(得分:4)
您可以使用CycleInterpolator
。例如,像这样:
int durationMs = 60000;
int cycleDurationMs = 1000;
view.setAlpha(0f);
view.animate().alpha(1f)
.setInterpolator(new CycleInterpolator(durationMs / cycleDurationMs))
.setDuration(durationMs)
.start();
答案 3 :(得分:3)
这里是Kotlin中的一个示例,它通过在 withEndAction
中递归调用动画来重复动画的简单方法示例
private var animationCount = 0
private fun gyrate() {
val scale = if (animationCount++ % 2 == 0) 0.92f else 1f
animate().scaleX(scale).scaleY(scale).setDuration(725).withEndAction(::gyrate)
}
这会反复对视图的大小进行动画处理,以使其变小,恢复正常,变小,恢复正常等。这是一种非常简单的模式,可以重复您想要的任何动画。
答案 4 :(得分:0)
final ViewPropertyAnimator animator = view.animate().rotation(360).setInterpolator(new LinearInterpolator()).setDuration(1000); //Animator object
animator.setListener(new android.animation.Animator.AnimatorListener() {
...
@Override
public void onAnimationEnd(final android.animation.Animator animation) {
animation.setListener(this); //It listens for animation's ending and we are passing this to start onAniationEnd method when animation ends, So it works in loop
view.setRotation(0);
view.animate().rotation(360).setInterpolator(new LinearInterpolator()).setDuration(1000).setListener(this).start();
}
});
答案 5 :(得分:0)
在kotlin中,您可以这样做。创建一个可运行的。在其内部为视图设置动画,并将withEndAction
设置为可运行本身。并在运行到动画开始时结束。
var runnable: Runnable? = null
runnable = Runnable {
view.animate()
.setDuration(10000)
.rotationBy(360F)
.setInterpolator(LinearInterpolator())
.withEndAction(runnable)
.start()
}
runnable.run()