[英]Loop in value animator cause in crash with java.lang.StackOverflowError: stack size 8MB
I using two value animation and in end of one i start another. 我使用两个值的动画,最后一个开始。 It is work fine on my tested devices but get java.lang.StackOverflowError: stack size 8MB
on many devices in live. 在我测试过的设备上可以正常工作,但在许多在线设备上都出现java.lang.StackOverflowError: stack size 8MB
。
this is how i used 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) {
}
});
I googled but coul not find any reason and solution. 我用谷歌搜索,但是找不到任何原因和解决方案。 Is any body have any idea? 有没有什么主意?
You should repeat animation instead of creating a loop dependency between them. 您应该重复动画而不是在它们之间创建循环依赖关系。 Use AnimatorSet
to do that: 使用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();
Here is the result: 结果如下:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.