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

时间:2014-04-03 04:58:27

标签: android android-canvas

我在画布上画了一个黑色的圆圈,我将画布的背景颜色设置为红色。

我只想看到黑色的圆圈作为我的视图,但我也得到了红色。

我尝试使用canvas.clipPath()来进行工作。我在网上搜索,发现我们需要禁用硬件加速才能使其正常工作。我试过了,但它仍然有效。

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

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

还有整个申请:

android:hardwareAccelerated="false"

两种情况下的Dint工作。 关于如何使其发挥作用的任何想法?

enter image description here

代码:

在这里我正在剪辑

    @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();
}

1 个答案:

答案 0 :(得分: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();
}

这样你就可以在pathClip

之后绘制背景

你不会看到任何红色,因为你画在它后面的所有路径上,如果我猜对了 - 你希望能够用一种颜色绘制一个圆的一部分,而其他颜色则是其他的 - 你可以如果您要剪辑的路径将是整圆,并且您绘制的路径将是您要绘制的部分,则实现它