2012-06-21 4 views
0

누군가가 나를 Android의 미친 Canvas 클래스를 이해하는 데 도움이됩니다. 그것은 정확하지 않은 것 같아요 왜 매개 변수가 부동 소수점 값을 왜 확실하지 않습니다.캔버스 그리기 정확도 문제

 mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setColor(Color.RED); 
     mPaint.setAntiAlias(false); 
     mPaint.setDither(false); 
     mPaint.setFilterBitmap(false); 

     Path path1 = new Path(); 
     path1.moveTo(151, 100); 
     path1.lineTo(200, 200); 
     path1.lineTo(100, 151); 
     path1.lineTo(200, 151); 
     path1.lineTo(100, 201); 
     path1.lineTo(151, 100); 
     // So that these points constitute a closed polygon 
     path1.setFillType(Path.FillType.EVEN_ODD); 
     mPaint.setStyle(Paint.Style.FILL); 
     mPaint.setColor(Color.GRAY); 
     // Draw the polygon 
     mCanvas.drawPath(path1, mPaint); 

에서 Windows GDI와 Windows의 유사한 코드를 실행하면 손톱 점을 정확하게 예를 들어, 여기에 내가 절대 소수점 값으로 그리려는 다각형이다. 그러나 안드로이드에는 두 가지 문제가 있습니다.

1) 앤티 앨리어스를 끈 경우에도 선이 앤티 앨리어스로 표시됩니다 (회색 선 주위에 검은 픽셀이 있음). 2) 항상 지정된 지점에 도달하지는 않습니다.

 Path path1 = new Path(); 
     path1.moveTo(151, 100-1); 
     path1.lineTo(200+1, 200+1); 
     path1.lineTo(100-1, 151); 
     path1.lineTo(200+2, 151); 
     path1.lineTo(100, 201); 
     path1.lineTo(151+1, 100); 

내가 여기에 규칙이나 무엇을 그 일을 알아낼 수 없습니다 : 가끔 가끔 내가 원하는 지점에 가까이하기 위해하지

하지, 않습니다, 나는이 작업을 수행해야 너무 이상합니다.

답변

1

Canvas가 아니라 Path 클래스와 마찬가지로 그 자체가 아닙니다. 지금은 당신이 날 디더 방법 인용 할 수 있도록, 진정한 mPaint.setDither(true)에 디더를 설정하는 것이 좋습니다 : 설정하거나 DITHER_FLAG 비트 디더링을 삭제, SETFLAGS에 대한

도우미() 장치보다 더 정밀하다 색상이 얼마나 영향을 다운 샘플링. 디더링은 일반적으로 더 빠르지 만 더 높은 정밀도의 색상이 잘려서 내려갑니다 (예 : 8888 -> 565). 디더링은 시각적 인 인공물을 줄이기 위해이 과정에서 고유 한 오류를 배포하려고 시도합니다.

즉, 색상을 분석하는 데 문제가있을 수 있음을 알려줍니다. 이것이 문제의 원인이 될 수 있습니다.

관련 문제