2013-05-28 10 views
7

Voglio disegnare una forma come definita utilizzando il percorso con una larghezza del tratto di 5 in cui tutto il tratto si trova all'interno del percorso anziché metà del tratto all'interno e metà all'esterno.Android - tratto all'interno del percorso

Grazie,

Carl

+0

Non capisco il problema, potresti essere più specifico? Cosa intendi dire "tutto il tratto è all'interno del Sentiero piuttosto che metà del tratto dentro e fuori"? – Marek

+1

Supponiamo di disegnare una forma con un tratto largo 10 pixel in nero e quindi disegnare sulla forma con un tratto largo 5 pixel in rosso, quindi il tracciato rosso sarà metà della larghezza del tracciato nero e sarà nel mezzo, poiché metà del tratto sarà all'interno del contorno della forma e metà sarà all'esterno. Invece quello che voglio è che l'intero tratto sia all'interno del contorno della forma. Nell'esempio sopra, ciò significherebbe che il tratto rosso si troverebbe su un lato del tratto nero, il lato più vicino al contorno della forma – user2430147

risposta

1

sembra che non può controllare la posizione della corsa (cioè, all'interno, centro o all'esterno). Per maggiori informazioni fare riferimento a: Android Paint stroke width positioning

La mia soluzione è compensato la larghezza del tratto durante il disegno ad esempio,

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

È possibile utilizzare la classe CornerPathEffect aiuto! Prendendo a disegnare una forma roundrect come un esempio.

Mentre si disegna un colore di sfondo con raggio utilizzando il metodo canvas.drawRoundRect() e il set di colori Style.FILL, è possibile ottenere una forma rect rotonda. E poi disegnando un bordo rect rotondo su di esso con Style.STROKE e la larghezza delle impostazioni della pittura usando lo stesso metodo, puoi ottenere un bordo.

Il codice:

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

Ora sembra, non è quello che voglio, che ha un po 'di offset tra sfondo e il bordo:

before

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

Ora sembra corretto:

after

+0

Il doppio della larghezza del tratto del dolore può risolvere il problema! – YXP

1

Usa Canvas#clipPath(Path, Op). Tuttavia, tieni presente che il supporto per il ritaglio su un percorso in una tela con accelerazione hardware è stato rimosso in Android 3.0 e reintroduced in 4.3. Apparentemente c'era un workaround per 3.0-4.2, ma non ho un modo per testarlo.

Problemi correlati