2013-10-15 32 views
7

Ho implementato un anello di disegno animato dall'inizio spazzando con successo da 0 a 360. Tuttavia, quando la coda dell'anello incontra la testa a 360 gradi, tutto il disegno scompare.Comportamento strano nel disegnare un anello utilizzando Path.arcTo() in Android

Questo è il mio codice per l'anello in onDraw()

 float startAngle = 270; 
     float sweepAngle = -359; 

     paint.setColor(Color.DKGRAY); 
     paint.setShadowLayer(4, 2, 2, 0x80000000); 

     rectF.set(cenX - outerRadius, cenY - outerRadius, cenX + outerRadius, 
       cenY + outerRadius); 
     path.arcTo(rectF, startAngle, sweepAngle); 
     //canvas.drawArc(rectF, 0, 360, false, paint); 
     rectF.set(cenX - innerRadius, cenY - innerRadius, cenX + innerRadius, 
       cenY + innerRadius); 
     /*paint.reset(); 
     paint.setAntiAlias(true); 
     paint.setColor(Color.WHITE); 
     canvas.drawArc(rectF, 0, 360, false, paint);*/ 
     path.arcTo(rectF, startAngle + sweepAngle, -(sweepAngle)); 

     canvas.drawPath(path, paint); 

e questo è il risultato,

enter image description here

preavviso qui che ho impostato sweepAngle a -359 poco prima che diventi cerchio. Tuttavia se cambio sweepAngle a -360. Produce questo risultato.

enter image description here

Scompare !! Qualcuno sa come risolvere questo per favore aiutami?

Grazie.

PS. Non voglio usare drawArc() perché voglio fare un buco dentro l'anello. Con drawArc(), il mio pulsante sarà sparito.

risposta

2

Suppongo che Android mod 360 prima di disegnarlo davvero. Quindi, x - 360 === x e non attirerà nulla!

+0

Credo di sì .... allora l'unico modo possiamo fare un altro disegno per sweepAngel = 360. Come @Kevin ha detto – SaintTail

+0

@SaintTail, questo indica il problema, ma non spiega come superarlo. Come mai questa è una risposta accettata? – azizbekian

1

Sono in ritardo con questo, ma l'ho risolto aggiungendo un cerchio solido come ultimo fotogramma dell'animazione (stavo usando AnimationDrawable, ma l'idea è la stessa in questo caso). Tutto il codice pareggio era lo stesso per quella dell'ultimo fotogramma, ad eccezione di una sola riga:

sostituire:

mPath.arcTo(rectF, startAngle, sweepAngle); 

con qualcosa di simile:

mPath.addCircle(cenX, cenY, innerRadius, Path.Direction.CCW);