canvas.clipPath()即使禁用了硬件加速也无法正常工作

ik0*_*024 3 android android-canvas

我在画布上绘制了一个用黑色填充的圆圈,并将画布的背景色设置为红色。

我只希望黑色的圆圈出现在我的视图中,但我也得到红色。

我尝试使用canvas.clipPath()来完成工作。我搜索了网络,发现我们需要禁用硬件加速才能使其正常工作。我尝试过,但仍然可以。

尝试针对特定视图禁用硬件加速:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Run Code Online (Sandbox Code Playgroud)

而且对于整个应用程序:

android:hardwareAccelerated="false"
Run Code Online (Sandbox Code Playgroud)

在这两种情况下都可以使用Dint。有关如何使其工作的任何想法?

在此处输入图片说明

码:

我在这里剪

    @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    this.canvas = canvas;
    path.reset();
    left = 50;
    top = 50;
    right = getWidth()- 50;
    bottom = getHeight()-50;



    RectF rectf = new RectF(left, top, right, bottom);
    path.arcTo(rectf, startAngle, sweepAngle);
    path.lineTo(linex, liney);

    canvas.clipPath(path);
    canvas.drawPath(path, paint);

    //canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)

Nir*_*ann 5

这不是剪辑路径的用途。当您绘制路径然后对其进行裁剪时-这意味着从该点开始在画布上绘制的其余所有内容都将被该路径遮盖。在您的情况下,您在剪切画布之前先绘制红色背景-因此它遍历了画布,然后您对其进行了剪切,但只在路径内部绘制,因此剪切没有用。

您可以在该代码中获得所需的内容:

// Do not set any background to the view before
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    this.canvas = canvas;
    path.reset();
    left = 50;
    top = 50;
    right = getWidth()- 50;
    bottom = getHeight()-50;



    RectF rectf = new RectF(left, top, right, bottom);
    path.arcTo(rectf, startAngle, sweepAngle);
    path.lineTo(linex, liney);

    canvas.clipPath(path);
    canvas.drawRect(0, 0, getWidth(), getHeight(), Red Paint in here);
    canvas.drawPath(path, paint);

    //canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以在pathClip之后绘制背景

您将看不到任何红色,因为如果您猜对了,那么您会在路径后的整个路径上绘制红色,如果您希望能够用一种颜色绘制圆形的一部分,而用另一种颜色绘制圆形的一部分,则可以实现您要剪切的路径将是整个圆,而您绘制的路径将是您要绘制的部分