英文原文:http://android-developers.blogspot.com/2009/03/window-backgrounds-ui-speed.html。正文是我自己做的笔记。
提高UI速度有很多方法,其中的一个是使用自定义的Theme。当你在Activity中调用setContentView()这个方法的时候,Android系统会将你自己的views加入到Activity的窗口当中。但是这个窗口不仅仅是包含你的views,还有一些是Android系统自带的views。其中最重要的一个view是Decorview,下面高亮的就是DecorView:
DecorView实际上是包含Activity的窗口的背景的。在Activity中调用getWindow().setBackgroundDrawable()可以改变Decorview的背景。
如果你使用的是Android自带的标准Theme的话,那么标准Theme的背景就会在你的view出现之前展现出来,也就是说,你首先看到的不是setContentView中的View,而是DecorView的背景图。
当我们使用一张不透明的图片作为Activity的背景时,就像下面这个例子这样:
上面是使用Android标准Theme的例子,可以看到帧率是44fps,也就是22毫秒一帧。一个可以使图像渲染得更快的办法是将DecorView的背景去掉。因为我们的图片不透明的,所以DecorView看起来就是多余的了。去掉DecorView的背景之后,帧率变成了51fps,看来速度的确有加快:
那到底应该怎么做呢?很简单,我们只要在res/values/theme.xml中新建一个style,然后其继承android:Theme,重写其中的android:windowBackground,将其值改为null。如下所示:
<resources>
<style name="Theme.NoBackground" parent="android:Theme">
<item name="android:windowBackground">@null</item>
</style>
</resources>
接着,我们可以将这个自定义的Theme加入到我们的Activity或者Application中,在AndroidManifest.xml中Activity标签和Application标签都有一个熟悉是android:theme,我们只要加上android:theme="@style/Theme.NoBackground"就可以了。这个方法是非常方便的,如果app中使用了MapView,WebView或者一些全屏不透明的View。
还有一种方法是我们可以将我们自己的View中的背景加入到Theme中,这样一开始的时候马上就能都得到加载View的背景,具体的使用方法是:在res/drawable/background_shelf.xml中定义bitmap标签:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/shelf_panel"
android:tileMode="repeat" />
然后在style/theme.xml中自定义theme:
<resources>
<style name="Theme.Shelves" parent="android:Theme">
<item name="android:windowBackground">@drawable/background_shelf</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
总结:有时候最好的方法就是最简单的方法,一旦你要创建一个带有不透明UI或者一个自定义的背景的时候,记得要改变window的背景。