20

AnimatorSetAndroid (無限)を繰り返す簡単な方法はありますか? を設定して、もう一度呼び出しAnimationListenerて再起動できますか?AnimatorSetstart()

MyAnimatorSetには、順番に再生される 2 つのアニメーションが含まれています。したがって、両方の単一アニメーションの繰り返しモードを繰り返すように設定すると、最初のアニメーションが 2 番目のアニメーションの実行中に繰り返されますよね?

4

8 に答える 8

19

最初の 2 つの質問には答えがあります

Android AnimatorSet (無限) を繰り返す簡単な方法はありますか? AnimationListener を設定し、もう一度 start() を呼び出して 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();

3 番目の質問に対する答えはノーです。最初のアニメーションが繰り返され、すべての繰り返しの後、後続のアニメーションが開始されます。

于 2013-10-09T08:59:16.063 に答える
2

いいえ、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()
}
于 2019-10-05T17:39:51.803 に答える
-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();
于 2015-06-24T18:14:01.470 に答える
-3

これはどう?

@Override
public void onAnimationEnd(Animator animation) {
    if (!mCanceled) {
        animation.reset();  //<- added.
        animation.start();
    }
}
于 2013-12-13T09:20:16.937 に答える