ObjectAnimator 重复循环延迟

3
<?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 等方式,但没有起作用。我希望在循环之间有一些延迟。
非常感谢您的帮助。

在提问之前,请参考如何提问。只要直接问你想要的问题,不要闲聊! - ThisaruG
3个回答

5

请尝试以下操作: 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);
    }
});

5
我认为更好的方式是将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);
    }
}

在我看来,这将会带来更好的体验。现在,您可以真正地重复您的动画,并监听onAnimationRepeat事件。


1

辅助类:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接