Android系统与IOS系统相比一个重要的缺点就是,IOS系统运行起来会更加流畅,这是Android系统用户体验不如IOS的原因之一。当然,Android系统也可以通过一系列的优化,来确保运行的流畅。
为了避免迟缓的UI效果或者运行的停顿,必须确保动画一直运行在每秒60帧。我们可以从硬件和软件两个方面来进行优化。
一、硬件加速
Android通过GPU来进行硬件加速。GPU,全称 Graphic Processing Unit,即“图形处理器”。它是相对于CPU的一个概念,是专门进行图像处理的核心处理器。绝大部分Android设备都有GPU。
因为启用硬件加速会消耗更多的资源和内存,而且硬件加速并不支持所有的2D动画效果,所以应该仅在需要的时候才使用硬件加速。
注意:在Android 4.0(API 级别 14)以上版本中,默认对所有应用程序都开启了硬件加速。
1、硬件加速级别
有四种级别:Application、Activity、Window、View
Application 层
首先将目标API设为11以上,然后在在AndroidManifest.xml文件里,添加以下属性到<application>标签里,针对整个应用开启硬件加速:
<uses-sdk android:targetSdkVersion="11" />
<application android:hardwareAccelerated="true" ...>
开启硬件加速最简单的方法是在整个应用全局设置。如果应用只使用标准的View和Drawable,全局设置不会产生不利的影响。然而,因为硬件加速不支持所有的2D绘制操作,开启会影响一些自定义View或者绘制调用。问题显示为不可见的元素、异常,或者错误渲染像素。如果你的应用执行自定义绘制,开启硬件加速,测试应用在实际的硬件设备上去查找问题。
Activity 层
如果整个应用开启硬件加速表现的不稳定,也可以针对单个Activity进行控制。在Activity层开启或者关闭硬件加速,可以使用android:hardwareAccelerated属性在<activity>标签内。下面是单个Activity中关闭硬件加速的例子:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
可以在全局设置硬件加速,然后再针对单个Activity关闭硬件加速。
Window 层
如果你需要更细致的控制,可以在获得的Window里开启硬件加速:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:在window层不能取消硬件加速。
View 层
通过下面代码,你可以在运行时关闭硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或者在view中加入属性:
android:layerType="software"
二、软件加速
在Android应用程序中,GUI线程不仅承担了绘制所有View的任务,还负责处理与用户的交互。所以,如何GUI线程忙于刷新View的话,它响应用户操作就会变慢,我们都知道,如果响应用户时间超过5s,程序就会报ANR错误,这是一种非常不好的用户体验。
为了解决这一类问题,可以使用以下几种方法:
1、软件加速。如上,在view中加入属性:
android:layerType="software"
则会使用一种软件的方式加速,我们知道,硬件加速有可能导致渲染错误,所以可以选用这种方式来进行加速。
2、使用SurfaceView,它使用后台线程控制并刷新View,使GUI线程能去执行其他计算任务。
3、使用TextureView,SurfaceView虽然改善了应用程序的性能,但它无法实现图像变换,换句话说,SurfaceView无法实现移动、缩放或旋转。但是TextureView可以支持普通的View操作。但是,值得注意的是:TextureView仅能用于启用了硬件加速的窗口,否则就绘制不出任何东西。
三、资料
Hardware Acceleration(android English API ) http://developer.android.com/guide/topics/graphics/hardware-accel.html
Android 4.0的图形硬件加速及绘制技巧(2) http://mobile.51cto.com/hot-302203_1.htm
android图形系统详解六:View layer http://www.2cto.com/kf/201204/127664.html