2013-01-07 14 views
11

क्या किसी को निम्नलिखित समस्या के लिए मेरे लिए संकेत है?छेद के साथ पथ खींचें (एंड्रॉइड)

मैं एक भरे पथ (कैनवास) को आकर्षित करना चाहता हूं जिसमें इसमें एक छेद है। एसवीजी पथ परिभाषा में अनुसरण है:

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 

मैं (विशिष्ट सॉफ्टवेयर डिजाइन की वजह से)

जावा के साथ मेरी कोशिश मुझे एक पूर्ण ड्रॉ पथ घटाना पथ के बिना इस पथ (आकार) आकर्षित करना चाहते हैं एक छेद के बिना वर्ग। मैं सोच रहा हूं, क्यों एक एसवीजी दर्शक घुमावदार परिभाषा के साथ छेद खींचता है और जावा कैनवास नहीं करता है? अंतर कहाँ है? इसे कैसे प्राप्त किया जा सकता है ?

  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

उपरोक्त कोड में, आप अपने आंतरिक वर्ग के लिए बस "moveTo" कर रहे हैं। – iagreen

+0

हां, इग्रीन सही है। पथ के बीच में 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

मैंने इसे प्राप्त करने से पहले पोर्टरडफ.मोड.क्लेयर का उपयोग किया था, लेकिन यदि छेद के साथ दृश्य के नीचे एक बनावट दृश्य लेआउट किया गया है, तो यह बनावट दृश्य में एक छेद भी काटता है। यह भी इस मामले में ठीक काम करता है। धन्यवाद! – Zarokka

0

एसवीजी निर्धारित करता है क्या fill-rule का उपयोग करके अंदर/एक पथ के बाहर। जावा एक घुमावदार नियम सेट करने की अनुमति भी देता है। एंड्रॉइड पथों के साथ fillType भी है जो समान रूप से काम करता है। शायद आपके पास जावा या एसवीजी कोड के लिए अलग-अलग नियम हैं?