Android属性动画卡顿的优化

在开发时,在聊天室内用到属性动画,时间久了卡顿,先看一下效果图:

礼物动画是 SVGA 动画和属性动画配合使用,才达到这样的效果;这是在聊天室内,会不停的刷这种礼物,在测试时,刷到70个左右,出现明显的卡顿现象;

为了解决卡顿的问题,去搜了挺多,最终找到了解决的方法;

先看我之前的写法:

        ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "scaleX", 1.0f);
        ObjectAnimator animatorY = ObjectAnimator.ofFloat(view, "scaleY", 1.0f);
        AnimatorSet animatorSet = new AnimatorSet();
        //动画持续时间
        animatorSet.setDuration(500);
        //X轴和Y轴同时开始
        animatorSet.playTogether(animatorX, animatorY);
        //动画开始
        animatorSet.start();

上面似乎没什么问题,但时间久了就是卡顿~~~;经过一番折腾,换成了下面的写法 :

    private PropertyValuesHolder animatorX;
    private PropertyValuesHolder animatorY;

    animatorX = PropertyValuesHolder.ofFloat("scaleX", 0f, 1.0f);
    animatorY = PropertyValuesHolder.ofFloat("scaleY", 0f, 1.0f);
    ObjectAnimator.ofPropertyValuesHolder(view, animatorX, animatorY).start();

换成这样之后,测试送了 200 个礼物也没有明显的卡顿;

有兴趣的可以下载我的小例子(项目中包括:SVGA 动画和属性动画配合使用实现复杂的动画效果,以及对属性动画的优化,解决卡顿的问题):

GitHub 下载地址:https://github.com/wuqingsen/Animation

到这里就讲完了,下面是其他的一些推荐写法,在这里做一下记录.

先看下面的写法:

AnimatorSet animSet = new AnimatorSet();

ObjectAnimator transYFirstAnim = ObjectAnimator.ofFloat(mView, "translationY", 0, 100);
ObjectAnimator transYSecondAnim = ObjectAnimator.ofFloat(mView, "translationY", 100, 0);
animSet.playSequentially(transYFirstAnim, transYSecondAnim);

将上面的写法替换为:

Keyframe k0 = Keyframe.ofFloat(0f, 0); //第一个参数为“何时”,第二个参数为“何地”
Keyframe k1 = Keyframe.ofFloat(0.5f, 100);
Keyframe k2 = Keyframe.ofFloat(1f, 0);

PropertyValuesHolder p = PropertyValuesHolder.ofKeyframe("translationY", k0, k1, k2);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(mView, p);
objectAnimator.start();

导致卡顿的最关键的还是内存泄漏,如果补间动画可以代替的话,还是使用补间动画,补间动画不会出现此问题

猜你喜欢

转载自blog.csdn.net/wuqingsen1/article/details/84827476