25

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

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

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

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

4

2 回答 2

42

clipPath只有 API 级别 18 和更高版本才支持硬件加速,在 API 级别从 11 到 17 需要关闭它。

您提到的文章包含一个线索:

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

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

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

于 2012-01-17T14:01:35.023 回答
29

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

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

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 >= 18 上抛出 UnsupportedOperationException。

请参阅不支持的绘图操作

于 2015-05-20T15:46:16.867 回答