Android
開發中,性能優化策略十分重要繪製性能的好壞 主要影響 :Android
應用中的頁面顯示速度html
繪製影響Android
性能的實質:頁面的繪製時間android
1個頁面經過遞歸 完成測量 & 繪製過程git
主要優化方向是:canvas
View.onDraw()
的複雜度(Overdraw)
過分繪製 會致使屏幕顯示的色塊不一樣,具體以下 性能優化
附:示例說明bash
不少 過分繪製是難以免的,如 上述實例的 文字 & 背景緻使的過分繪製;只能儘量避免過分繪製:ide
2
次(綠色)如下,藍色最理想Window
背景windowBackground
,如默認的 Light 主題:<style name="Theme.Light">
<item name="isLightTheme">true</item>
<item name="windowBackground">@drawable/screen_background_selector_light</item>
...
</style>
複製代碼
問題 通常狀況下,該默認的 Window 背景基本用不上:因背景都自定義設置 若不移除,則致使全部界面都多 1 次繪製工具
解決方案 移除默認的 Window 背景佈局
// 方式1:在應用的主題中添加以下的一行屬性
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 或者 -->
<item name="android:windowBackground">@null</item>
// 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代碼移除
getWindow().setBackgroundDrawable(null);
<!-- 或者 -->
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
複製代碼
如2個常見場景:性能
ListView
與 Item
列表頁(ListView)
與 其內子控件(Item)
的背景相同 = 白色,故可移除子控件(Item)
佈局中的背景ViewPager
與 Fragment
對於1個ViewPager
+ 多個 Fragment
組成的首頁界面,若每一個 Fragment
都設有背景色,即 ViewPager 則無必要設置,可移除關於更多場景,可以使用工具 Hierarchy View
查看,具體請看文章: 過渡繪製的使用工具:Hierarchy View
<merge>
& 合適選擇佈局類型clipRect()
DrawerLayout
佈局 = 左抽屜佈局@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTim
// ...僅貼出關鍵代碼
// 1. 遍歷 DrawerLayout 的 child view,拿到抽屜佈局
for (int i = 0; i < childCount; i++) {
final View v = getChildAt(i);
if (v == child || v.getVisibility() != VISIBLE
|| !hasOpaqueBackground(v) || !isDrawerView(v)
|| v.getHeight() < height) {
continue;
}
// a. 如果左抽屜佈局
// 則取抽屜佈局的右邊界做爲裁剪區的左邊界、設置原主佈局的裁剪區域,如上圖裁剪區域
if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) {
final int vright = v.getRight();
if (vright > clipLeft) clipLeft = vright;
// b. 如果右抽屜佈局
// 則取抽屜佈局的左邊界做爲裁剪區的右邊界、設置原主佈局的裁剪區域
} else {
final int vleft = v.getLeft();
if (vleft < clipRight) clipRight = vleft;
}
}
// 2. 經過clipRect()設置原主佈局的顯示範圍 = 裁剪區域,使其僅在上圖中的紅框區域(即不阻礙抽屜佈局的區域)顯示
// 從而避免過分繪製
canvas.clipRect(clipLeft, 0, clipRight, getHeight());
}
......
}
複製代碼
quickreject()
至此,關於繪製優化的方案講解完畢。
此處主要介紹 經常使用的:
hierarchy viewer
、Profile GPU Rendering
、Systrace
簡介 Android Studio
提供的UI性能檢測工具。
做用 可視化得到UI佈局設計結構 & 各類屬性信息,幫助咱們優化佈局設計
即 :方便查看
Activity
佈局,各個View
的屬性、佈局測量-佈局-繪製的時間
簡介 一個 圖形監測工具
做用 渲染、繪製性能追蹤
能實時反應當前繪製的耗時
提供一個標準的耗時,若是高於標準耗時,就表示當前這一幀丟失
更詳細使用請看: Profile GPU Rendering 使用指南
Android 4.1
以上版本提供的性能數據採樣 & 分析工具Android
系統各個組件隨着時間的運行狀態 & 提供解決方案
- 收集 等運行信息,從而幫助開發者更直觀地分析系統瓶頸,改進性能 檢測範圍包括:
Android
關鍵子系統(如WindowManagerService
等Framework
部分關鍵模塊)、服務、View系統- 功能包括:跟蹤系統的
I/O
操做、內核工做隊列、CPU
負載等,在 UI 顯示性能分析上提供很好的數據,特別是在動畫播放不流暢、渲染卡等問題上
Android
性能優化中的 繪製優化下面我將繼續深刻講解 Android
中的性能優化 ,感興趣的同窗能夠繼續關注本人的 稀土掘金博客