为提高app的整体性能,在manifest文件中配置的时候,有可能会启动硬件加速,如下
android:hardwareAccelerated="true"
配置后,发现设备在4.0.4与4.0.3这样的版本上使用图片剪裁功能的时候会crash,捕获到的异常信息如下
java.lang.UnsupportedOperationException at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:429)
查询代码发现,在图片剪裁的时候有使用到Canvas.clipPath(path, Region.Op.DIFFERENCE);这个函数
作为Canvas的一个实现类GLES20Canvas,在使用硬件加速的时候会被使用到。
查询GLES20Canvas的源代码,发现在4.0.4与4.0.3这两个版本中,clipPath的实现均为如下代码
public boolean clipPath(Path path, Region.Op op) {
throw new UnsupportedOperationException();
}
直到4.1.1这个版本,sdk中的才进行了具体的实现
@Override
public boolean clipPath(Path path, Region.Op op) {
// TODO: Implement
path.computeBounds(mPathBounds, true);
return nClipRect(mRenderer, mPathBounds.left, mPathBounds.top,
mPathBounds.right, mPathBounds.bottom, op.nativeInt);
}
也就是说,在使用Canvas.clipPath的时候必须要特别注意如果app要使用硬件加速,应该把涉及clipPath的Activity排除在外,配置方法是:
在manifest中activity的配置处配置android:hardwareAccelerated ="false"