2013-05-28 16 views
7

Tüm strokun, içeride ve yarısı dıştan inmenin yarısı yerine Yolun içinde olduğu, strok genişliği 5 olan Yol kullanılarak tanımlandığı gibi bir şekil çizmek istiyorum.Android - içerideki kontur

sayesinde

Carl

+0

Sorunu anlamıyorum, daha spesifik olabilir misiniz? Ne demek "tüm inme yarısı içeride ve yarısı dışarıdan değil, yolun içindedir" derken ne demek istiyorsun? – Marek

+1

Siyah renkte 10 piksel genişliğinde bir konturlu bir şekil çiziyorum ve daha sonra 5 piksel genişliğinde kırmızı renkte bir kontur ile şekil çiziyorum, sonra kırmızı yol siyah yolun genişliğinin yarısı olacak ve ortada, inme yarısı şekil sınırı içinde olacak ve yarısı dışarıda olacaktır. Bunun yerine istediğim, tüm konturun şekil sınırının içinde olması. Yukarıdaki örnekte, bu kırmızı konturun siyah konturun bir tarafında olacağı anlamına gelecektir, kenar sınırına en yakın olan taraf – user2430147

cevap

1

O inme (dışarıda yani, içeride, merkezi veya) pozisyonunu kontrol edemez görünüyor. örneğin çizerken Android Paint stroke width positioning

Çözümümün çizgi genişliğini dengeleniyor,

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

Yardım için CornerPathEffect sınıfını kullanabilirsiniz: için daha fazla bilgi için bkz! Örnek olarak yuvarlak bir şekil çizmek.

Canvas.drawRoundRect() yöntemini kullanarak radiuslu bir arka plan rengi çizerken ve Style.FILL boya setini ayarlarken yuvarlak bir yuvarlak biçim elde edebilirsiniz. Daha sonra Style.STROKE ile bir yuvarlak kenarlı kenarlık çizmek ve aynı yöntemi kullanarak boya ayarının genişliğini, bir kenarlık alabilirsiniz.

kodu:

before

en CornerPathEffect deneyelim:, bazı arka plan ve sınırı arasında ofset etmiştir istediğim biri Şimdi benziyor

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); 

değil

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); 

Şimdi doğru görünüyor:

after

+0

Ağrı strok genişliği problemi çözebilir! – YXP

1

kullanın Canvas#clipPath(Path, Op). Ancak, Android 3.0 ve reintroduced in 4.3 sürümlerinde bir donanım hızlandırılmış tuvalde bir yolun kırpılmasına yönelik desteğin kaldırıldığını unutmayın. Görünüşe göre 3.0-4.2 için bir workaround vardı, ama bunu test etmenin bir yolu yok.

İlgili konular