最近项目中遇到了很多需要用Path切割画布的效果,但是我是怎么切,都是切不出来。但是用Canvas drawPath效果和预想的效果是一致,但是就是执行clipPath,出来的效果完全不是自己想要的效果。今天终于发现了原因。
硬件加速的问题
好多手机上一旦开启硬件加速,还会报以下的问题:
java.lang.unsupported operation exception, android.view.GLES20Canvas.clipPath(GLES20Canvas...
所以一旦出现上述异常,那么我们就应该立即想到,是硬件加速出了问题。
开启硬件加速后,以下方法都会出现异常:
Canvas clipPath() clipRegion() drawPicture() drawTextOnPath() drawVertices() Paint setLinearText() setMaskFilter() setRasterizer() XfermodesAvoidXfermode PixelXorXfermode
In addition, some operations behave differently with hardware acceleration enabled:
要解决以上问题,那么就需要关闭硬件加速。如何处理硬件加速的开关状态呢?
<applicationandroid:hardwareAccelerated="true" ...>
2.Activity
<application android:hardwareAccelerated="true"> <activity ... /> <activityandroid:hardwareAccelerated="false" /> </application>
3.Window
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
4.View
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
如何判断是否开启了硬件加速
在绘制之前,你必须做该测试 Canvas.isHardwareAccelerated() 替代View.isHardwareAccelerated() 在必要时。
.Canvas.isHardwareAccelerated();// returns true if the Canvas is hardware accelerated