2014-10-24 5 views
6

나는 Path을 가로 지르며 두 번 이상 지나간 영역의 색을 변경하고 싶습니다. 아래처럼 : 하나의 경로에서 겹치는 영역을 그립니다.

desired behavior

그래서 나는 나의 페인트를 설정합니다. 내가 canvas.drawPath(mPath1, highlighterPaint)canvas.drawPath(mPath2, highlighterPaint)를 호출 할 때

highlighterPaint = new Paint(); 
    highlighterPaint.setAntiAlias(true); 
    strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, 
      displayMetrics); 
    highlighterPaint.setStrokeWidth(strokeWidth); 
    highlighterPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); 
    highlighterPaint.setAlpha(200); 
    highlighterPaint.setStyle(Paint.Style.STROKE); 
    highlighterPaint.setStrokeJoin(Paint.Join.ROUND); 

는하지만 아래의 이미지를 얻을. 이 그림에는 끝 점이 표시된 두 개의 경로가 있습니다.

actual behavior

은 내가 Canvas에 각 경로를 그리는거야.

별도 Path은 공유 영역을 올바르게 어둡게하지만, Path은 그렇지 않습니다. 첫 번째 이미지와 비슷한 효과를 얻으려면 어떻게해야합니까?

답변

1

Path이 작업을 수행 할 수 없습니다. 결코 두려워하지 말고, 더 좋은 방법이 있습니다!

트릭은 경로를 여러 개의 작은 섹션으로 분할하고 각 섹션을 개별적으로 그립니다.

필자의 경우, 일련의 점 (터치 입력에서 생성)과 점을 연결하는 2 차 베 지어를 그리는 경로를 작성했습니다. 여기에 빠른 개요입니다 : 당신이 당신의`View.onDraw()가`그리는 동안 다음 관리를 비트 맵으로 경로를 그릴이 방법을 사용하는 경우 그것은 또한 아주 좋은 생각,

int numPoints = 0; 
for (Point p : points) { 
    p1X = p2X; 
    p1Y = p2Y; 
    p2X = p3X; 
    p2Y = p3Y; 
    p3X = p.x; 
    p3Y = p.y; 

    numPoints++; 
    if (numPoints >= 3) { 
     startX = (p1X + p2X)/2.0f; 
     startY = (p1Y + p2Y)/2.0f; 
     controlX = p2X; 
     controlY = p2Y; 
     endX = (p2X + p3X)/2.0f; 
     endY = (p2Y + p3Y)/2.0f; 
     path.rewind(); 
     path.moveTo(startX, startY); 
     path.quadTo(controlX, controlY, endX, endY); 
     canvas.drawPath(path, paint); 
    } 
} 
+0

내가 언급하는 것을 잊었다 당신의 비트 맵보기로. – GDanger