【问题标题】:ObjectAnimator repeat loop delayObjectAnimator 重复循环延迟
【发布时间】:2017-02-19 16:16:10
【问题描述】:
<?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 秒。我试过动画听众onRepeatonEnd 有点东西,但没有奏效。我希望循环之间有一些延迟。

我们将不胜感激。

【问题讨论】:

  • 在提问前请参阅how to ask。只问你想要什么,不要闲聊!

标签: java android animator


【解决方案1】:

我发现最好将 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 事件。

【讨论】:

    【解决方案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);
        }
    });
    

    【讨论】:

      【解决方案3】:

      助手类

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

      【讨论】:

        猜你喜欢
        • 2018-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多