【转】Android UI 性能優化教學

基於如何在合理利用資源的前提下,更進一步的提升視覺表現力。這裡所提到的視覺表現力並不是指直觀所看到的視覺效果,而是性能的提升。

這裡將包含兩個主要內容:

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的內容:

  1. <resources>    <style name="Theme.NoBackground" parent="android:Theme">        <item name="android:windowBackground">@null</item>    </style></resources>
複製代碼

同時也需要修改AndroidMainfest.xml文件,將上邊所創建的Theme應用到Activity中,格式為:

  1. <application android:icon="@drawable/icon" android:label="@string/app_name">        
  2. <activity android:name=".EggImageViewer"                  android:label="@string/app_name"                  android:theme="@style/Theme.NoBackground">            
  3. <intent-filter>               
  4.  <action android:name="android.intent.action.MAIN" />             
  5.    <category android:name="android.intent.category.LAUNCHER" />       
  6.      </intent-filter>     
  7.    </activity>   
  8.  </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

  1. <bitmap xmlns:android="http://schemas.android.com/apk/res/android"    android:src="@drawable/shelf_panel"    android:tileMode="repeat" />
複製代碼

創建res/values/theme.xml

  1. <resources>    <style name="Theme.Shelves" parent="android:Theme">        <item name="android:windowBackground">@drawable/background_res</item>        <item name="android:windowNoTitle">true</item>    </style></resources>
複製代碼

往往一些看似簡單的方法,卻能起到非常大的作用。還希望大家在實踐中能不斷的挖掘出非常實用的技巧,然後與你周圍的人共享你的發現,同時在大家共同的見證下可以完善你的想法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值