Android DrawPath不会填充封闭区域

时间:2014-08-05 23:27:59

标签: java android android-canvas android-drawable

以下列表显示了用于创建路径的x,y坐标和特定方法。

0 0 moveTO

180 0 lineTo

180 0 moveTO

246 227,127 24,115 150立方吨 127 276,246 71,180 300立方米

180 300 moveTO

44 261,166 332,90 339 cubicTo

14 332,136 261,0 300 cubicTo

0 300 moveTO

0 0 lineTo

原始数据点

x = [0,180,180,246,127,115,127,246,180,180,44,166,90,14,136,0,0,0]

y = [0,0,02,224,24,150,276,71,300,300,261,332,339,332,261,300,300,0]

这个算法的想法是画出四个方面。两边是直线。其他两方面 由每条曲线中有七个点的贝塞尔曲线组成。这是使用1 moveTo和2 cubicTo方法绘制的。

目前,如果我使用Paint.Style.STROKE,它会创建一个封闭的不规则形状。当使用Paint.Style.FILL在画布上绘制时,它仅填充形状的一部分,在中间留下一个大的方形部分。已填充的部分零件位于封闭区域外。

paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
canvas.drawPath(path, paint);

我的目标是绘制一个覆盖这个封闭区域的位图。但是,由于填充路径未正确填充区域,因此无法实现目标。

有没有办法实现这一点。

谢谢

1 个答案:

答案 0 :(得分:3)

请发布您的实际代码。如果您在到达点集之后或之前调用moveTo或lineTo,则不清楚您的格式。

编辑:

moveTo调用是不必要的,lineTo和cubicTo调用已经将你移动到新的点。

您的代码:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.FILL);

    p.moveTo(0, 0);
    p.lineTo(180, 0);
    p.moveTo(180, 0);
    p.cubicTo(246, 227, 127, 24, 115, 150);
    p.cubicTo(127, 276, 246, 71, 180, 300);
    p.moveTo(180, 300);
    p.cubicTo(44, 261, 166, 332, 90, 339);
    p.cubicTo(14, 332, 136, 261, 0, 300);
    p.moveTo(0, 300);
    p.lineTo(0, 0);

    canvas.drawPath(p, paint);
}

产生了这个:

image with drawing error

删除moveTo调用(并使用close()而不是lineTo(0,0)):

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.FILL);

    p.lineTo(180, 0);
    p.cubicTo(246, 227, 127, 24, 115, 150);
    p.cubicTo(127, 276, 246, 71, 180, 300);
    p.cubicTo(44, 261, 166, 332, 90, 339);
    p.cubicTo(14, 332, 136, 261, 0, 300);
    p.close();

    canvas.drawPath(p, paint);
}

产生了这个:

fixed image