Loop in value animator cause in crash with java.lang.StackOverflowError: stack size 8MB
Loop in value animator cause in crash with java.lang.StackOverflowError: stack size 8MB
我使用两个值的动画,在一个结束时开始另一个。它在我测试过的设备上运行良好,但在许多实时设备上得到 java.lang.WhosebugError: stack size 8MB
。
这就是我使用 value animator 的方式:
ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);
fadeIn.setDuration(300);
fadeOut.setDuration(300);
fadeOut.setStartDelay(500);
fadeIn.start();
fadeIn.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
fadeOut.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
fadeOut.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
fadeIn.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
我用谷歌搜索但找不到任何原因和解决方案。有人知道吗?
您应该重复动画而不是在它们之间创建循环依赖。使用 AnimatorSet
来做到这一点:
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);
ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
fadeIn.setDuration(300);
fadeOut.setDuration(300);
fadeOut.setStartDelay(500);
animatorSet.playSequentially(fadeIn, fadeOut);
animatorSet.setDuration(1100);
animatorSet.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();
}
}
});
animatorSet.start();
结果如下:
我使用两个值的动画,在一个结束时开始另一个。它在我测试过的设备上运行良好,但在许多实时设备上得到 java.lang.WhosebugError: stack size 8MB
。
这就是我使用 value animator 的方式:
ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);
fadeIn.setDuration(300);
fadeOut.setDuration(300);
fadeOut.setStartDelay(500);
fadeIn.start();
fadeIn.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
fadeOut.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
fadeOut.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
fadeIn.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
我用谷歌搜索但找不到任何原因和解决方案。有人知道吗?
您应该重复动画而不是在它们之间创建循环依赖。使用 AnimatorSet
来做到这一点:
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator fadeIn = ObjectAnimator.ofInt(drawableIcon, "alpha", 0, 255);
ObjectAnimator fadeOut = ObjectAnimator.ofInt(drawableIcon, "alpha", 255, 0);
fadeIn.setDuration(300);
fadeOut.setDuration(300);
fadeOut.setStartDelay(500);
animatorSet.playSequentially(fadeIn, fadeOut);
animatorSet.setDuration(1100);
animatorSet.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();
}
}
});
animatorSet.start();
结果如下: