12

次の問題のヒントを教えてくれる人はいますか?

穴のある塗りつぶされたパス (キャンバス) を描画したいと思います。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 ビューアは、言及された定義で穴を描画し、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);

ヒントはありますか?

よろしく

4

2 に答える 2

36

使用する必要があります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);
于 2013-01-07T14:42:03.587 に答える
0

SVG は、 fill-ruleを使用してパスの内側と外側を判別します。Java では、ワインディング ルールを設定することもできます。Android パスには、同様に機能するfillTypeもあります。おそらく、Java または SVG コードに異なるルールを設定していませんか?

于 2013-01-07T14:45:31.910 に答える