2013-10-15 5 views
7

Ich habe einen animierten Zeichnungsring implementiert, indem Sie erfolgreich im Winkel von 0 bis 360 fegen. Wenn jedoch das Ende des Rings seinen Kopf im 360-Grad-Winkel trifft, verschwinden alle Zeichen.Seltsames Verhalten beim Zeichnen eines Rings mit Path.arcTo() in Android

Dies ist mein Code für den Ring 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); 

und das ist das Ergebnis,

enter image description here

Hinweis hier, dass ich sweepAngle nur auf -359 gesetzt, bevor es Kreis wird. Allerdings, wenn ich sweepAngle zu -360 ändern. Es erzeugt dieses Ergebnis.

enter image description here

Es verschwindet !! Wer weiß, wie das zu lösen, bitte helfen Sie mir?

Danke.

PS. Ich möchte nicht drawArc() verwenden, weil ich ein Loch in den Ring machen möchte. Mit drawArc() ist mein Knopf weg.

Antwort

2

Ich nehme an, Android wird Mod 360 vor dem Zeichnen wirklich. So x - 360 === x und es wird nichts zeichnen!

+0

Ich denke, so .... dann der einzige Weg, wir können tun, ist eine andere Zeichnung für SweepAngel = 360. Wie @Kevin sagte – SaintTail

+0

@SaintTail, dies weist auf das Problem, aber nicht sagen, wie man es überwinden. Wie kommt es, dass diese Antwort akzeptiert wird? – azizbekian

1

Ich bin viel zu spät, aber ich löste es, indem ich einen festen Kreis als das letzte Bild der Animation hinzufügte (ich benutzte AnimationDrawable, aber die Idee ist in diesem Fall die gleiche). All die Auslosung Code war das gleiche für das letzte Frame, mit der Ausnahme einer Zeile:

ersetzen:

mPath.arcTo(rectF, startAngle, sweepAngle); 

mit so etwas wie:

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