Android Error之动画递归

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/I_do_can/article/details/74207185

本文记录一个动画产生的递归错误

系统:

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();

猜你喜欢

转载自blog.csdn.net/I_do_can/article/details/74207185