2013-01-07 148 views
11

沒有人對我有以下問題的提示?繪製孔(安卓)路徑

我要提請其在它的孔的填充路徑(畫布)。 在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 canvas卻沒有?區別在哪裏?我怎樣才能做到這一點?

  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); 

任何提示?

問候

+0

在上面的代碼中,您只是爲您的內部廣場「移動」。 – iagreen

+0

是的,iagreen是對的。取出路徑中間的p.close()。 –

回答

28

你應該使用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); 
+0

完美,非常感謝!祝你有個美好的時光... –

+0

我之前使用過PorterDuff.Mode.CLEAR來達到這個目的,但是如果一個紋理視圖在有孔洞的視圖下面展開,那麼也會在紋理視圖本身中劃出一個洞。這也適用於這種情況。謝謝! – Zarokka

0

SVG決定使用fill-rule裏面有什麼/一個路徑之外。 Java也允許設置纏繞規則。有了Android路徑,還有一個fillType,它的工作原理類似。也許你爲java或SVG代碼設置了不同的規則?