基於如何在合理利用資源的前提下,更進一步的提升視覺表現力。這裡所提到的視覺表現力並不是指直觀所看到的視覺效果,而是性能的提升。
這裡將包含兩個主要內容:
Drawing(繪製的刷新率)
Startup Time (啟動Activities的時間)
以上兩個性能的優化都將依賴於 Window backGround drawable功能設置。
通過Window backGround標識會對部分人產生一定的誤解,其實每次通過setContentView()來顯示預先配置的界面時,Android僅僅是將你所創建的Views添加到Activiy的Window中。而且這個Window並不僅僅包含你所創建的Views,還包括Android為 Activity預置的元素。通過Emulator運行你的程序,然後通過Hierarchy Viewer查看當前程序UI架構Root節點 DecorView,這個是Android額外添加的最頂層的節點。
實際上Window background drawable是由DecorView決定的。可以在Activity中調用getWindow().setBackgroundDrawable()方法來設置DecorView的background drawable。這裡要特別注意這個方法是針對當前版本的Android平台,以後可能會因為版本的更新或不同的硬件設備而改變。(目前我們僅針對G1,如果在其它環境下測試需要小心驗證)
如果目前正在使用android默認的標準Themes,那麼在調用getWindow().setBackgroundDrawable()方法之後,這個background drawable將會影響你的activities。通過一個例子來直觀的比較性能提升的效果:
可以看到保持activity的redraw模式下,當前的FPS為39幀 /每秒,大概相當於25毫秒/每幀。由於這個例子中將ImageView設為全屏顯示,並且完全覆蓋了activity的背景,所以background drawable佔用了不必要的計算資源。下邊創建一個新的Theme並且應用在Activity中,創建res/values/theme.xml, XML的內容:
- <resources> <style name="Theme.NoBackground" parent="android:Theme"> <item name="android:windowBackground">@null</item> </style></resources>
同時也需要修改AndroidMainfest.xml文件,將上邊所創建的Theme應用到Activity中,格式為:
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".EggImageViewer" android:label="@string/app_name" android:theme="@style/Theme.NoBackground">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
(也可以將Theme應用於<Application />標籤中)完成上邊的修改後,再來看看當前的FPS發生了什麼變化:
FPS可以增大到60+,性能得到如此大的提升,是不是比較難以置信呢?由此可以明白當應用MapView或者WebView全屏顯示的應用程序時,可以借用這個簡單設置的方法,來提升整體的性能。
通過上邊的例子可以直觀的瞭解window background drawable的優化方法,並且根據比較可以很明顯的看到設置前後的性能對比,希望這個簡單的技巧可以給你的應用帶來幫助。
另外基於這個技巧的應用,還可以延展出另外一個優化功能。對於某些需要全屏顯示的應用程序,可以通過Theme定義Window』s background的圖片,從而提高Activity的啟動速度。畢竟無需建立一個ImageView作為自定義的背景,而重複疊加在Activity window background。
實現方法:
創建 res/drawable/background_res.xml
- <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/shelf_panel" android:tileMode="repeat" />
創建res/values/theme.xml
- <resources> <style name="Theme.Shelves" parent="android:Theme"> <item name="android:windowBackground">@drawable/background_res</item> <item name="android:windowNoTitle">true</item> </style></resources>
往往一些看似簡單的方法,卻能起到非常大的作用。還希望大家在實踐中能不斷的挖掘出非常實用的技巧,然後與你周圍的人共享你的發現,同時在大家共同的見證下可以完善你的想法!