首页>Program>source

从android 3.0开始, clipPath ()方法在打开了硬件加速功能的设备中不再受支持。(请阅读此技术< / a>,基本上是面具。

最新回答
  • 2021-1-11
    1 #

    Canvas.clipPath()API 18以来,已重新引入了对硬件加速的支持

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

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

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

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

    无论如何,永远不要在API>= 18上抛出UnsupportedOperationException。

    请参阅不受支持的图形操作

  • 2021-1-11
    2 #

    clipPath 只有18级及更高版本的API才支持硬件加速功能,而11至17级的API级别则需要将其关闭。

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

    If your application is affected by any of these missing features or limitations, you can turn off hardware acceleration for just the affected portion of your application by calling setLayerType(View.LAYER_TYPE_SOFTWARE, null). This way, you can still take advantage of hardware acceleratin everywhere else. See Controlling Hardware Acceleration for more information on how to enable and disable hardware acceleration at different levels in your application.

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

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

相关问题

  • ios:从情节提要中获取自定义原型单元格的高度?
  • java:如何使用可变参数和反射