優化重於泰山
對於同樣機器環境上的應用來說,拋去受CPU、屏幕和系統GUI系統的固有時間消耗外,要實現流暢的動畫的核心也就是減少視圖Draw的時間。
這裏有幾點經驗可以跟大家分享一下:
- 儘量不要在刷新時做耗時操作,必須準備數據,創建圖片,圖片變換等,數據和圖片都應該在之間就加載到內存中,圖片變換用canvas的變換來實現。
- 同一個界面中多個動畫重疊出現時,儘量將動畫的刷新過程統一進行刷新,避免頻繁的invalidate,尤其是多個動畫有時序上的關係時更應該統一。
- 儘量使用帶有參數的invalidate來刷新,這樣可以減少很多運算量。
- 合理的環境下使用surfaceview來操作,比如播放視頻等,這種刷新耗時比較大的情況。
開啓硬件加速,硬件加速由於採用了顯示列表的概念,所以刷新過程也有很大的優化,但是會增加額外的8M內存佔用。
Animation流暢度
動畫線程中,少做動畫外的事情(比如拖動的時候同時做了圖片加載,或進度轉圈),或用子線程去做這一件事;多個View做動畫,變成一個View做多個動畫,從而減少View Tree遞歸調用;
消失的或不在屏幕中的bg,view不繪製,減小繪製面積(bg繪製前用clipRect控制),減小緩存尺寸;不要用requestLayout實現動畫,用矩陣變換代替,少用clipPath剪切圖片;
不要設置listview的selector;
動畫時間控制在400ms以內;
利用好硬件加速;
動畫用nineoldandroid或者在實現的時候儘量把動畫的繪製都放到一個消息循環裏面;
Layout加載速度
簡化動畫布局(包括view層級和數量),不用的佈局可以用viewstub包住在用的時候inflate;
提前將佈局inflate傳入,記得處理static引用;