ObjectAnimator задержка повторного цикла
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="rotationX"
android:valueFrom="0"
android:valueTo="-360"
android:repeatCount="infinite">
</objectAnimator>
Это мой объект аниматор xml
//Animating the NormalLayout
final ObjectAnimator anim4 = (ObjectAnimator) //Object animator
AnimatorInflater.loadAnimator(this, R.animator.rotate_four);
//And this is my java code
Я хочу добавить задержку между циклами, например, 3 секунды между циклами снова. Я попробовал анимацию слушателей onRepeat
, onEnd
вроде как, но это не сработало. Я хочу некоторую задержку между циклами.
Любая помощь будет оценена до предела.
2 ответа
Пожалуйста попробуйте 1. удалить свойство xml android:repeatCount="infinite"
2. добавить код Java
anim4.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
anim4.start();
}
}, 3000);
}
});
Я считаю, что лучше изменить DelayedAnimationRepeater, чтобы не перезапускать анимацию и, таким образом, разрешить вызов.setRepeatCount(ValueAnimator.INFINITE) и onAnimationRepeat, как и следовало ожидать.
Так что просто измените его на
public class DelayedAnimationRepeater implements Animator.AnimatorListener {
private long delayMillis;
public DelayedAnimationRepeater(long delayMillis) {
this.delayMillis = delayMillis;
}
@Override
public void onAnimationStart(Animator animator) { }
@Override
public void onAnimationEnd(final Animator animator) { }
@Override
public void onAnimationCancel(Animator animator) { }
@Override
public void onAnimationRepeat(Animator animator) {
animator.pause();
new Handler().postDelayed(animator::resume, delayMillis);
}
}
приводит к гораздо лучшему опыту imho. Теперь вы можете по-настоящему повторить свою анимацию и прослушать событие onAnimationRepeat.
Хелпер класс:
public class DelayedAnimationRepeater implements Animator.AnimatorListener {
private long delayMillis;
public DelayedAnimationRepeater(long delayMillis) {
this.delayMillis = delayMillis;
}
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(final Animator animator) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Start delay should only affect initial start, not repeats
animator.setStartDelay(0);
animator.start();
}
}, delayMillis);
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
}
Использование:
anim4.addListener(new DelayedAnimationRepeater(3000));