重复AnimatorSet

时间:2013-07-12 19:08:54

标签: android animation

有没有一种简单的方法来重复Android AnimatorSet(无限)?我可以设置AnimationListener并再次致电AnimatorSet重启start()吗?

我的AnimatorSet包含两个按顺序播放的动画。 因此,如果我将两个单一动画的重复模式设置为重复,那么第二个动画的重复模式将在第二个运行时重复,对吗?

7 个答案:

答案 0 :(得分:26)

设置它的子对象动画师的重复模式和计数;

objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
objectAnimator.setRepeatMode(ObjectAnimator.RESTART/REVERSE...);

然而,由于还有另一个错误,这将无法停止或取消。

很明显,我并不喜欢你可以在Android中制作动画的各种方式,并且让它们以某种方式让你失败。希望这有助于其他人。

答案 1 :(得分:17)

前两个问题有答案

  

有没有一种简单的方法来重复Android AnimatorSet(无限)?我可以通过再次调用start()来设置AnimationListener并重新启动animatorSet吗?

是的,有:

mAnimationSet.addListener(new AnimatorListenerAdapter() {

  private boolean mCanceled;

  @Override
  public void onAnimationStart(Animator animation) {
    mCanceled = false;
  }

  @Override
  public void onAnimationCancel(Animator animation) {
    mCanceled = true;
  }

  @Override
  public void onAnimationEnd(Animator animation) {
    if (!mCanceled) {
      animation.start();
    }
  }

});
mAnimationSet.start();

第三个问题的答案是否定的。将重复第一个动画,并且在所有重复之后将启动后续动画。

答案 2 :(得分:1)

不,您不能重复AnimatorSet,只能重复单个ObjectAnimator / ValueAnimator

但是您可以使用PropertyValuesHolder,以便可以从一组PropertyValuesHolder中创建一个ObjectAnimator

这里是例子

val translateY = PropertyValuesHolder.ofFloat(View.TRANSLATION_Y, -100f, 100f)
val alpha = PropertyValuesHolder.ofFloat(View.ALPHA, 0.3f, 0.7f)
val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 0.8f, 1.2f)
val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 0.8f, 1.2f)
// and more

ObjectAnimator.ofPropertyValuesHolder(myView, translateY, alpha, scaleX, scaleY).apply {
    interpolator = AccelerateDecelerateInterpolator()
    // duration of each animation
    duration = 500L
    // repeat infinite count (you can put n times)
    repeatCount = ValueAnimator.INFINITE
    // reverse animation after finish
    repeatMode = ValueAnimator.REVERSE
    // start animation
    start()
}

答案 3 :(得分:1)

设置无限重复计数并为所有子动画重新启动/反向重复模式

animatorSet.childAnimations.forEach {
            val animator  = it as ObjectAnimator
            animator.repeatCount = ObjectAnimator.INFINITE
            animator.repeatMode = ObjectAnimator.RESTART / REVERSE
}

答案 4 :(得分:0)

在我的脑海中 - 动画框架是痛苦的源泉,特别是如果你想支持2.x.我经常遇到试图用AnimationListener种“玩家”做任何更复杂的跟踪的集合的问题。我跟踪我播放的动画(如int等)然后在onAnimationEnd上我开始另一个应该按顺序播放的动画。这样我就可以轻松地“编写”我的序列,并且不会打扰破坏的框架。

答案 5 :(得分:-2)

因此,上述选项都不合适。

如果您使用:

  @Override
  public void onAnimationEnd(Animator animation) {
    if (!mCanceled) {
      animation.start();
    }
  }

有时你最终会得到stackOverFlow异常。

最好的事情是做一些事情:

Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true && getActivity() != null) {
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            set3.start();
                        }
                    });
                    SystemClock.sleep(1200);
                }
            }
        });
        t.start();

答案 6 :(得分:-3)

这个怎么样?

@Override
public void onAnimationEnd(Animator animation) {
    if (!mCanceled) {
        animation.reset();  //<- added.
        animation.start();
    }
}