【问题标题】:Andorid DrawPath doesn't fill-up the enclosed areaAndroid Draw Path 没有填满封闭区域
【发布时间】:2014-08-05 23:27:58
【问题描述】:

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

0 0 移动到

180 0 行至

180 0 移动到

246 227、127 24、115 150立方至127 276、246 71、180 300
立方到

180 300 移动到

44 261、166 332、90 339 立方至

14 332, 136 261, 0 300 立方至

0 300 移动到

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, 0, 227, 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);

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

有没有办法实现这一点。

谢谢

【问题讨论】:

    标签: java android android-canvas android-drawable


    【解决方案1】:

    请发布您的实际代码。如果您在到达一组点之后或之前调用 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);
    }
    

    制作了这个:

    删除 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);
    }
    

    制作了这个:

    【讨论】:

    • 抱歉,无法发布代码。它冗长且分散在几个文件中。坐标是每种方法中使用的值。例如,Path.moveTo(0, 0); Path.lineTo(180 0 ); Path.cubicTo(246, 227, 127, 24, 115, 150) 列表显示了方法调用的顺序。谢谢
    • 我已经更新了我的答案,提供了修复和解释以及图像,以显示两段代码的结果。
    • "moveTo 电话是不必要的" ...谢谢!我认为他们是并且计划在我得到这个填充工作后立即删除它们:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多