在开发时,在聊天室内用到属性动画,时间久了卡顿,先看一下效果图:
礼物动画是 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();
导致卡顿的最关键的还是内存泄漏,如果补间动画可以代替的话,还是使用补间动画,补间动画不会出现此问题。