Android Error之动画递归

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

系统:

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值