1. 程式人生 > >Android屬性動畫卡頓的優化

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

導致卡頓的最關鍵的還是記憶體洩漏,如果補間動畫可以代替的話,還是使用補間動畫,補間動畫不會出現此問題