转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/123338017 本文出自【赵彦军的博客】
Android 硬件加速原理
Android 硬件加速原理
理解Android硬件加速原理的小白文
硬件加速控制(Controlling Hardware Acceleration)
android提供了以下四个级别的硬件加速控制:
- Application
- Activity
- Window
- View
Application级别
在应用的Android清单文件中,把下列属性添加到元素中,能够开启整个应用程序的硬件加速:
<application android:hardwareAccelerated="true" ...>
Activity级别
如果不能再应用程序级别全局打开硬件加速,那么也可以在Activity级别上进行控制。在<activity> 元素中使用 android:hardwareAccelerated 属性,能够启用或禁止Activity级别的硬件加速。
以下示例启用全局的硬件加速,但却禁止了一个Activity的硬件加速:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
Window级别
如果需要更精细的控制,就可以使用下列代码来针对给定的Window来启用硬件加速:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:目前无法在Window级别禁止硬件加速。
View级别
在运行时,可以针对一个独立的View对象使用下列代码来禁止硬件加速:
view.setLayerType(LAYER_TYPE_SOFTWARE, null);
事实上,view.setLayerType(LAYER_TYPE_SOFTWARE, null) 这个方法的作用并不是关闭硬件加速,只是当它的参数为LAYER_TYPE_SOFTWARE 的时候,可以顺便把硬件加速关掉而已;并且除了这个方法外,Android并没有提供专门的View级别的硬件加速开关,所以它就顺便成了一个开关硬件加速的方法。
view.setLayerType(LAYER_TYPE_HARDWARE, null);
判断一个View对象是否被硬件加速
有些时候,知道当前的View对象(尤其是自定义View)是否被硬件加速对应用程序来说是非常有用的。如果应用程序做了很多定制的绘图操作,并且不是所有的操作都会被新的渲染管道所支持,那么这种判断就特别有用。
有两种不同的方法来检查应用程序是否被硬件加速了:
- View.isHardwareAccelerated():如果View对象被绑定在硬件加速的Window,则返回true
- Canvas.isHardwareAccelerated():Canvas对象被硬件加速,则返回true
如果有必要在绘制代码中做这种检查,那么在可能的情况下,要使用Canvas.isHardwareAccelerated() 方法来代替 View.isHardwareAccelerated() 方法。这是由于,当一个 View 对象跟一个被硬件加速的窗口绑定的时候,它依然能够使用使用一个非硬件加速的Canvas对象。例如,把一个View对象绘制到缓存中的一个位图时就会发生这种情况。
|