Android 图形与硬件加速
今天在研究Android-PullToRefresh的时候,突然发现 清单文件中有这么一句 android:hardwareAccelerated="true"。以前没有见过,果断百度,发现原来是与硬件加速有关,参见google开发者文档》
说是从Android3.0 开始 ,Android的2D 管道线就被设计成支持硬件加速的了。硬加速使用GPU承担了所有在View的canvas上执行的绘制操作。同时这样的应用也会消耗更多的内存。
启用硬加速最简单的的方法是对整个应用启用硬件速.如果你的应用只使用标准的view和Drawable,全局启用硬加速将不会带来任何负面影响.然而,因为硬加速不是被所有的2D绘制所支持,所以启用它时可能对你的自定义绘制产生影响.出现的问题经常是不可见的,也可能是异常,或错误地显示了像素.为了避免这些问题,Android提供了在以下各级别上启用或禁止硬加速的能力:
Application |||| Activity |||| Window |||| View
Application级别
在应用的Android清单文件中,把下列属性添加到<application>元素中,来开启整个应用程序的硬件加速。
<applicationandroid:hardwareAccelerated="true" ...>
Activity级别
如果应用程序不能够正确的使用被打开的全局硬件加速,那么也可以对Activity分别进行控制。在<activity>元素中使用android:hardwareAccelerated属性,能够启用或禁止Activity级别的硬件加速。以下示例启用全局的硬件加速,但却禁止了一个Activity的硬件加速:
<applicationandroid:hardwareAccelerated="true"> <activity .../> <activityandroid:hardwareAccelerated="false"/> </application>
Window级别
如果需要更细粒度的控制,就可以使用下列代码来针对给定的窗口来启用硬件加速:
注意:当前不能在Window级别禁止硬件加速。
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
View级别
能够使用下列代码在运行时针对一个独立的View对象来禁止硬件加速:
注意:当前不能在View级别开启硬件加速。View层除了禁止硬件加速以外,还有其他的功能,更多的相关信息请看本文的“View层”。
myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
判定一个View是否能被硬加速
有时一个应用了解是否启用了硬件速是很有用的,对那些自定义View之类的东西尤其重要.在你的应用做了一些不被最新的管线所支持的自定义绘制时这更加重要
有两种方法可以检查应用是否被硬加速:
View.isHardwareAccelerated();//如果View附加到一个硬加速的window上就返回true. Canvas.isHardwareAccelerated();//如果Canvas被硬加速了就返回true.
如果你必须在你的绘制代码中做这个,应使用Canvas.isHardwareAccelerated()而不是View.isHardwareAccelerated().当一个view附加到一个硬加速的window上,它仍可以使用非硬件速的Canvas进行绘制操作.比如当为了高速缓存而把一个view画到一个bitmap中.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。