解决android中不再支持的Canvas.clipPath()



从android 3.0开始,clipPath()方法在启用硬件加速的设备中不再受支持。(阅读本文了解更多详细信息)。

我正在使用画布,我需要绘制圆形图像。关于我该怎么做有什么想法吗?

*我无法关闭硬件加速,我正在寻找其他解决方案。

回答:Tnx@Malcolm谢谢你的回答。我找到了一个很好的例子来演示这种技术,它基本上是一个面具。

带硬件加速的clipPath仅在API 18级及更高级别中受支持,在API 11至17级中需要关闭。

你提到的文章包含一条线索:

如果您的应用程序受到这些缺失功能或限制中的任何一个的影响,您可以通过调用setLayerType(View.LAYER_TYPE_SOFTWARE,null)仅关闭应用程序中受影响部分的硬件加速。这样,你仍然可以在其他地方利用硬件促进剂。有关如何在应用程序的不同级别启用和禁用硬件加速的详细信息,请参阅控制硬件加速。

这里的主要思想是在应用程序中需要在API级别低于18的设备上使用不支持的方法的部分禁用硬件加速。您可以对特定视图执行此操作,而无需对整个应用程序完全关闭它。

如果你不想关闭硬件加速,那么我建议你使用Porter-Duff模式。您可以创建一个带有圆圈的位图,然后使用这种模式在画布上绘制图像,将图像剪辑到原始内容。

Canvas.clipPath()对硬件加速的支持自API 18起重新引入。

解决该问题的最佳方法是仅当您在API上从11运行到17:时才调用setLayerType(View.LAYER_TYPE_SOFTWARE, null)

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2
        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    setLayerType(LAYER_TYPE_SOFTWARE, null);
}

我还用try-catch块包围了clipPath()调用,以避免意外的应用程序崩溃:

if (doClip) {
    try {
        canvas.clipPath(clipPath);
    } catch (UnsupportedOperationException e) {
        Log.e(TAG, "clipPath() not supported");
        doClip = false;
    }
}

无论如何,不应在API上引发UnsupportedOperationException>=18。

请参阅不支持的绘图操作

最新更新