本文记录一个动画产生的递归错误
系统:
Android 4.4 部分机型
错误日志
java.lang.StackOverflowError
at android.view.GLES20DisplayList.setScaleX(GLES20DisplayList.java:280)
at android.view.ViewPropertyAnimator.setValue(ViewPropertyAnimator.java:926)
at android.view.ViewPropertyAnimator.access$900(ViewPropertyAnimator.java:48)
at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationUpdate(ViewPropertyAnimator.java:1089)
at android.animation.ValueAnimator.animateValue(ValueAnimator.java:1251)
at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1175)
at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1216)
at android.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:524)
at android.animation.ValueAnimator.start(ValueAnimator.java:936)
at android.animation.ValueAnimator.start(ValueAnimator.java:946)
at android.view.ViewPropertyAnimator.startAnimation(ViewPropertyAnimator.java:820)
at android.view.ViewPropertyAnimator.start(ViewPropertyAnimator.java:400)
at com.benqu.wuta.views.LoadingView$1.onAnimationEnd(LoadingView.java)
at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.java:1030)
at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1056)
at android.animation.ValueAnimator.cancel(ValueAnimator.java:969)
at android.view.ViewPropertyAnimator.animatePropertyBy(ViewPropertyAnimator.java:882)
at android.view.ViewPropertyAnimator.animateProperty(ViewPropertyAnimator.java:838)
at android.view.ViewPropertyAnimator.alpha(ViewPropertyAnimator.java:662)
at com.benqu.wuta.views.LoadingView$1.onAnimationEnd(LoadingView.java)
at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.java:1030)
at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1056)
at android.animation.ValueAnimator.cancel(ValueAnimator.java:969)
at android.view.ViewPropertyAnimator.animatePropertyBy(ViewPropertyAnimator.java:882)
at android.view.ViewPropertyAnimator.animateProperty(ViewPropertyAnimator.java:838)
at android.view.ViewPropertyAnimator.alpha(ViewPropertyAnimator.java:662)
at com.benqu.wuta.views.LoadingView$1.onAnimationEnd(LoadingView.java)
at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.java:1030)
at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1056)
at android.animation.ValueAnimator.cancel(ValueAnimator.java:969)
at android.view.ViewPropertyAnimator.animatePropertyBy(ViewPropertyAnimator.java:882)
at android.view.ViewPropertyAnimator.animateProperty(ViewPropertyAnimator.java:838)
at android.view.ViewPropertyAnimator.alpha(ViewPropertyAnimator.java:662)
at com.benqu.wuta.views.LoadingView$1.onAnimationEnd(LoadingView.java)
at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.java:1030)
再看一下代码
public void startAnimation(){
postInvalidate();
this.animate().scaleX(1.2f).scaleY(1.2f)
.alpha(0.5f).setListener(animatorListener).start();
}
private Animator.AnimatorListener animatorListener =
new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
animate().scaleX(1f).scaleY(1f)
.alpha(1f).setListener(null).setDuration(0).start();
setVisibility(GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
};
分析 递归环路
ViewPropertyAnimator.alpha -> onAnimationEnd -> ViewPropertyAnimator.alpha ...
是4.4的系统 调用了 alpha 动画后调用 onAnimationEnd
解决:先取消 回调
animate().setListener(null).
scaleX(1f).scaleY(1f).alpha(1f).setDuration(0).start();