Android硬件加速小结

前言

Android从3.0版本开始加入了硬件加速,这样就能够充分利用手机硬件GPU来提升界面的渲染效果。但是这种技术还有一些限制,比如有些开启了硬件加速的界面上无法使用Canvas的clipPath接口,一点调用就会抛出不支持的异常。现在来对硬件加速的小知识点做一些总结。

开启/关闭硬件加速

在硬件加速的开启/关闭可以分成四种层次上做。最高的层次就是在整个应用里开启或关闭硬件加速,只需要在AndroidManifest文件动application标签里定义android:hardwareAccelerated属性就可以了。

<application 
android:hardwareAccelerated="true"
....  
>  

第二层就是Activity,第三层是Window。Activity的打开/关闭硬件加速也是在Activity注册的时候android:hardwareAccelerated属性定义的。刚开始接触的时候还觉得Activity和Window不是一回事吗,为什么要分成两个层次呢?其实了解Android底层的Window类型就会明白Activity是应用窗口类型,Dialog属于子窗口类型,子窗口类型一定要附加在应用窗口类型上才能存活,也就是Activity代表了它自己和内部的所有子窗口,而Window只代表一个窗口。比如Activity的应用窗口不支持硬件加速,而它打开的一个对话框需要做复杂的动画效果,这时候可以只对这个对话框打开硬件加速。它们二者只有Activity可打开也可以关闭硬件加速,而Window类型的只能打开硬件加速功能。

getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

最后一种就是视图View对象了,View通常都是放在Window里面的,Window只能开启硬件加速,而View就只能关闭硬件加速了。比如在View中执行canvas.clipPath来实现圆角矩形操作,但是有些手机上就会出现硬件加速不支持,但是整个界面又要做复杂动画效果需要开始硬件加速,可以只对当前的View关闭硬件加速效果。

setLayerType(View.LAYER_TYPE_SOFTWARE, null);  
// canvas.clipPath();

不支持操作

硬件加速在开启的情况下很容易与Canvas和paint的一些配置不兼容,最常见的就是抛出不支持异常。笔者在开发过程中曾经碰到过在有些国产机上出现崩溃,但是公司的测试机不包含这种手机导致线上崩溃。如果有人在开启硬件加速的页面使用一下的接口,注意要加上try..catch代码防止出现问题。

Canvas不支持硬件加速的二维绘图接口:
- clipPath()
- clipRegion()
- drawPicture()
- drawPosText()
- drawTextOnPath()
- drawVertices()

Paint不支持硬件加速的接口:
- setLinearText()
- setMaskFilter()
- setRasterizer()

你可能感兴趣的:(Android学习)