2013-05-28 4 views
7

ストローク幅が5のパスを使用して定義された形状を描画したい場合、ストロークの内側と外側の半分ではなく、ストロークのすべてがパス内にあります。Android - ストローク内のパス

おかげで、

カール

+0

私はこの問題を理解していない、より具体的になる可能性がありますか? 「ストロークのすべてが、ストロークの内側と外側の半分ではなく、パスの内側にある」とはどういう意味ですか? – Marek

+1

黒で10ピクセル幅のストロークで図形を描画し、幅が5ピクセルの線を描いた図形を赤で描画すると、赤のパスは黒のパスの幅の半分になります。真ん中では、ストロークの半分が形状の境界の内側にあり、半分が外側にあります。代わりに私がしたいのは、ストローク全体が形状境界の内側にあることです。上記の例では、これは赤いストロークが黒いストロークの片側にあることを意味します。形状境界に最も近い側 – user2430147

答えて

1

脳卒中(すなわち、内側、中央または外)の位置を制御することはできませんようです。詳細はを参照してください: Android Paint stroke width positioning

あなたが助けをCornerPathEffectクラスを使用することができ、例えば

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

を描きながら私のソリューションは、ストローク幅をオフセットさ!一例として丸みのある形状を描く。

canvas.drawRoundRect()メソッドを使用して半径を持つ背景色を描画し、ペイントでStyle.FILLを設定すると、円形の矩形が得られます。そして、同じメソッドを使用してStyle.STROKEとペイントの設定の幅で丸い四角形の枠線を描画すると、境界線を取得できます。

コード:

before

はのはCornerPathEffectを試してみましょう::、それはいくつかの背景と境界の間のオフセットしている私が欲しい1今、それがどのように見える

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

痛みのストロークの幅を2倍にすると問題を解決できます! – YXP

1

使用Canvas#clipPath(Path, Op)。ただし、Android 3.0およびreintroduced in 4.3では、ハードウェアアクセラレーションキャンバス内のパスへのクリッピングのサポートが削除されていることに注意してください。明らかに3.0〜4.2のためにworkaroundがありましたが、私はそれをテストする方法がありません。

関連する問題