AnimatorSet
Android (無限)を繰り返す簡単な方法はありますか? を設定して、もう一度呼び出しAnimationListener
て再起動できますか?AnimatorSet
start()
MyAnimatorSet
には、順番に再生される 2 つのアニメーションが含まれています。したがって、両方の単一アニメーションの繰り返しモードを繰り返すように設定すると、最初のアニメーションが 2 番目のアニメーションの実行中に繰り返されますよね?
最初の 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 番目の質問に対する答えはノーです。最初のアニメーションが繰り返され、すべての繰り返しの後、後続のアニメーションが開始されます。
いいえ、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()
}
したがって、上記のオプションはどれも適切ではありません。
使用する場合:
@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();
これはどう?
@Override
public void onAnimationEnd(Animator animation) {
if (!mCanceled) {
animation.reset(); //<- added.
animation.start();
}
}