2013-05-28 3 views
7

스트로크 너비가 5 인 패스를 사용하여 정의 된대로 모양을 그려야합니다. 모든 스트로크가 안쪽 획 및 반쪽 바깥 쪽 선의 절반보다 경로 안에있는 경우입니다.안드로이드 - 경로 안의 획

감사

+0

나는이 문제를 이해하지 못한다. 당신은 더 구체적 일 수 있는가? "모든 뇌졸중이 뇌졸중의 절반이 아니라 경로의 내부에있다"는 것은 무엇을 의미합니까? – Marek

+1

스트로크가 검정색으로 10 픽셀 인 스트로크를 그린 다음 스트로크가 5 픽셀 인 빨강으로 모양을 그린 다음 빨간색 패스는 검정 패스의 너비의 절반이되며 중간에 스트로크의 절반이 모양 경계 안에 있고 반은 바깥에있을 것입니다. 대신 내가 원하는 것은 모든 스트로크가 도형 ​​경계 안에 있어야한다는 것입니다. 위의 예에서 빨간색 스트로크는 검정색 스트로크의 한쪽 측면에 있으며 모양 경계에 가장 가까운 쪽 – user2430147

답변

1

는 스트로크 (즉 외부, 내부, 또는 중심)의 위치를 ​​제어 할 수없는 것으로 보인다. 예를 들어, 그리는 동안 Android Paint stroke width positioning

내 솔루션은 스트로크 폭을 상쇄,

final RectF rectF = new RectF(halfStrokeWidth, halfStrokeWidth, width - halfStrokeWidth, height - halfStrokeWidth); 
canvas.drawRoundRect(rectF, roundX, roundY, paint); 
1

당신은 도움을 CornerPathEffect 클래스를 사용할 수 있습니다에 대한 추가 정보를 원하시면를 참조하십시오! 예를 들어 둥근 모양으로 그리기.

canvas.drawRoundRect() 메서드를 사용하여 반경이있는 배경색을 그리고 페인트가 Style.FILL을 설정하는 동안 둥근 사각형 모양을 얻을 수 있습니다. 그리고 같은 방법을 사용하여 페인트의 설정의 Style.STROKE와 너비로 원형 직사각형 테두리를 그립니다. 테두리를 얻을 수 있습니다.

코드 :

before

이의이 CornerPathEffect을 해보자 :, 일부 배경 및 테두리 사이의 오프셋을 한 내가 원하는 것을 지금의 모습

mBackgroundRectF.set(0, 0, mWidth, mHeight); 
canvas.drawRoundRect(mBackgroundRectF, mRadius, mRadius, mBackgroundPaint); 
// edge ajustment because paint stroke style is center align 
float edge = mBorderWidth/2; 
mBackgroundRectF.set(edge, edge, mWidth - edge, mHeight - edge); 
canvas.drawRoundRect(mBackgroundRectF, mRadius, mRadius, mBorderPaint); 

하지

mBackgroundRectF.set(0, 0, mWidth, mHeight); 
canvas.drawRoundRect(mBackgroundRectF, mRadius, mRadius, mBackgroundPaint); 
// edge ajustment because paint stroke style is center align 
float edge = mBorderWidth/2; 
mBackgroundRectF.set(edge, edge, mWidth - edge, mHeight - edge); 
// use CornerPathEffect and then use drawRect() method 
mBorderPaint.setPathEffect(new CornerPathEffect(mRadius/2)); 
canvas.drawRect(mBackgroundRectF, mBorderPaint); 

이제 올바르게 보입니다.

after

+0

두 배의 스트로크 스트로크로 문제를 해결할 수 있습니다! – YXP

1

사용 Canvas#clipPath(Path, Op). 그러나 하드웨어 가속 캔버스의 경로에 클리핑을 지원하면 Android 3.0 및 reintroduced in 4.3에서 제거되었습니다. 분명히 3.0-4.2에 대해 workaround이 있었지만 테스트 할 방법이 없습니다.

관련 문제