解决Android中不支持的Canvas.clipPath()问题

从android 3.0 开始 ,硬件加速的设备不再支持clipPath()方法。(阅读这篇文章的更多细节)。

我正在使用canvas,我需要绘制圆形的图像。 任何想法,我怎么能做到这一点?

*我无法closures硬件加速,我正在寻找其他解决scheme。

回答:Tnx @Malcolm为您的答案。 我find了一个很好的例子来certificate这个技巧 ,它基本上是一个面具。

API 18开始, Canvas.clipPath()支持硬件加速。

解决此问题的最佳方法是仅在从11到17的API上运行时调用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; } } 

无论如何,UnsupportedOperationException绝不应该在API> = 18上抛出。

请参阅不支持的绘图操作

具有硬件加速function的clipPath仅在API级别18和更高级别支持,API级别从11到17时才需要closures。

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

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

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

如果你不想closures硬件加速,那么我会build议使用Porter-Duff模式。 您可以创build一个带有圆圈的位图,然后使用这种将您的图像剪切为原始内容的模式将图像绘制到canvas上。