【问题标题】:draw path with hole ( android )绘制带孔的路径(android)
【发布时间】:2012-12-21 07:01:45
【问题描述】:

有人对以下问题有提示吗?

我想绘制一个填充路径(画布),其中有一个洞。 在 SVG 中,路径定义如下:

M 100 100 L 200 100 L 200 200 L 100 200 L 100 100 z
M 125 125 L 175 125 L 175 175 L 125 175 L 125 125 z

我想在没有路径减去路径的情况下绘制这条路径(形状)(因为特定的软件设计)

我对 java 的尝试画出了一个没有洞的完整正方形。我想知道,为什么 SVG 查看器会使用 Mentoined 定义绘制洞而 Java 画布没有?区别在哪里?我怎样才能做到这一点?

            Path p=new Path();
        p.moveTo(100, 100);
        p.lineTo(200,100);
        p.lineTo(200,200);
        p.lineTo(100,200);
        p.close();
        p.moveTo(150, 150);
        p.moveTo(180, 150);
        p.moveTo(180, 180);
        p.moveTo(150, 180);
        p.close();
        canvas.drawPath(p, paint);

有什么提示吗?

问候

【问题讨论】:

  • 在上面的代码中,你只是为你的内部正方形做“moveTo”。
  • 是的,iagreen 是对的。取出路径中间的p.close()。

标签: android canvas svg


【解决方案1】:

SVG 使用fill-rule 确定路径内部/外部的内容。 Java 还允许设置缠绕规则。对于 Android 路径,还有一个 fillType,其工作方式类似。也许您为 java 或 SVG 代码设置了不同的规则?

【讨论】:

    【解决方案2】:

    你应该使用Path.setFillType(Path.FillType.EVEN_ODD):

    final Path path = new Path();
    final Paint paint = new Paint();
    
    paint.setColor(Color.RED);
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
    
    path.moveTo(100, 100);
    path.lineTo(200, 100);
    path.lineTo(200, 200);
    path.lineTo(100, 200);
    path.close();
    
    path.moveTo(150, 150);
    path.lineTo(180, 150);
    path.lineTo(180, 180);
    path.lineTo(150, 180);
    path.close();
    
    path.setFillType(Path.FillType.EVEN_ODD);
    canvas.drawPath(path, paint);
    

    【讨论】:

    • 我之前使用 PorterDuff.Mode.CLEAR 来实现这一点,但如果纹理视图布局在带有孔的视图下方,那么也会在纹理视图本身中切出一个洞。在这种情况下也可以正常工作。谢谢!
    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多