Android屬性動畫卡頓的優化
阿新 • • 發佈:2018-12-12
在開發時,在聊天室內用到屬性動畫,時間久了卡頓,先看一下效果圖:
禮物動畫是 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();
導致卡頓的最關鍵的還是記憶體洩漏,如果補間動畫可以代替的話,還是使用補間動畫,補間動畫不會出現此問題。