Android UI 优化 1

来源:互联网 发布:java两个日期相差天数 编辑:程序博客网 时间:2024/05/17 00:51

前边已经介绍了如何通过Layout优化系统资源,减少不必要的资源占用。基于如何在合理利用资源的前提下,更进一步的提升视觉表现力。这里所提到的视觉表现力并不是指直观所看到的视觉效果,而是性能的提升。

这里将包含两个主要内容:

  • Drawing(绘制的刷新率)
  • Startup Time (启动Activities的时间)

     以上两个性能的优化都将依赖于 Window backGround drawable功能设置
通过WindowbackGround标识会对部分人产生一定的误解,其实每次通过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的背景,所以backgrounddrawable占用了不必要的计算资源。下边创建一个新的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’sbackground的图片,从而提高Activity的启动速度。毕竟无需建立一个ImageView作为自定义的背景,而重复叠加在Activitywindow 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>往往一些看似简单的方法,却能起到非常大的作用。还希望大家在实践中能不断的挖掘出非常实用的技巧,然后与你周围的人共享你的发现,同时在大家共同的见证下可以完善你的想法!

 

原创粉丝点击