I want to draw a shape as defined using Path with a stroke width of 5 where all of the stroke is inside the Path rather than half the stroke inside and half outside.
Thanks,
Carl
I want to draw a shape as defined using Path with a stroke width of 5 where all of the stroke is inside the Path rather than half the stroke inside and half outside.
Thanks,
Carl
It seems it can not control the position of the stroke (i.e, inside, center or outside). For more info refer to: Android Paint stroke width positioning
My solution is offset the stroke width while drawing e.g.,
final RectF rectF = new RectF(halfStrokeWidth, halfStrokeWidth, width - halfStrokeWidth, height - halfStrokeWidth);
canvas.drawRoundRect(rectF, roundX, roundY, paint);
You can use CornerPathEffect class for help! Taking drawing a roundrect shape as an example.
While drawing a background color with radius using canvas.drawRoundRect() method and the paint sets Style.FILL, you can get a round rect shape. And then drawing a round rect border on it with Style.STROKE and width of paint's setting using the same method, you can get a border.
The code:
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);
Now it looks like, it isn't the one i want which has some offset between background and border:
Let's try 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);
// use CornerPathEffect and then use drawRect() method
mBorderPaint.setPathEffect(new CornerPathEffect(mRadius / 2));
canvas.drawRect(mBackgroundRectF, mBorderPaint);
Now it looks correct:
Use Canvas#clipPath(Path, Op)
. But be aware that support for clipping to a path in a hardware accelerated canvas was removed in Android 3.0 and reintroduced in 4.3. There was apparently a workaround for 3.0-4.2, but I don't have a way to test it.