2013-01-07 5 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 

나는

이 자바 나의 시도는 나에게 풀립니다

(때문에 특정 소프트웨어 설계의) 경로 빼기 경로없이이 경로 (모양) 그릴 싶습니다 구멍없이 사각형. 왜 SVG 뷰어가 멘토링 된 정의로 구멍을 긋고 자바 캔버스가 그려지지 않는지 궁금하다. 그 차이는 어디입니까? 이것을 어떻게 할 수 있습니까?

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

어떤 힌트일까요? 당신은 Path.setFillType(Path.FillType.EVEN_ODD)를 사용해야합니다

관련

+0

위 코드에서 내부 사각형에 대해 "moveTo"를 수행하고 있습니다. – iagreen

+0

예, iagreen이 옳습니다. 경로의 중간에있는 p.close()를 꺼냅니다. –

답변

28

:

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도 있습니다. 자바 또는 SVG 코드에 대해 다른 규칙을 설정했을 수 있습니까?

관련 문제