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));
Другие вопросы по тегам