Android clipPath 等效于硬件加速视图



我的应用程序中唯一仍然是软件渲染的部分是渲染一个视图,我需要在其中绘制圆形位图。我正在使用 clipPath 来剪辑需要渲染为圆形的位图。

我知道clipPath不是硬件加速的,但我正在寻找一种算法,允许我使用硬件加速提供等效的功能。

具体来说,我需要创建源位图的圆形剪切区域,并将其渲染到我的画布上。

如果您必须使用 clipPath,您可以关闭硬件加速,如下所示。

<application
    android:label="@string/application_name"
    android:hardwareAccelerated="false">

您还可以控制应用程序、活动、窗口和视图层之间的硬件加速。有关 Android 开发网站上的此硬件加速文章的详细信息。

您可以尝试这样做,尽管我不确定它是否是硬件加速的:

在创建中:

  • 创建一个使用 setXfermode 的画图(称为 bitmapPaint):http://developer.android.com/reference/android/graphics/Paint.html#setXfermode(android.graphics.Xfermode)
  • 放一个 避免Xfermode,它也被弃用了,它工作得很好。以高容差传递白色和目标模式(如 240)

在布局中:

  • 创建与视图大小相同的位图
  • 在画布上用白色绘制圆圈,使用抗锯齿获得干净的边框

在绘制中:

  • 在绘画画布中使用白色圆圈绘制位图
  • 现在,使用您在 onCreate 中创建的位图在画图画布内绘制位图

位图应仅在圆内呈现。

如果位图没有发生很大更改,请将其剪切到形状上一次,然后到新的位图中,然后在 onDraw 中绘制剪裁的位图。

下面是如何从源位图中裁剪圆的示例

Bitmap bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas canvas = new Canvas(bitmap);
paint.setColor(Color.RED);
// Draw your shape here
canvas.drawCircle(cx, cy, radius, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));    
canvas.drawBitmap(sourceBitmap, 0, 0, paint);

最新更新