2013-10-15 11 views
7

Zaimplementowałem animowany pierścień rysunkowy, rozpoczynając od zamiatania pod kątem od 0 do 360 z powodzeniem. Jednak gdy ogon pierścienia styka się z głową pod kątem 360 °, cały rysunek znika.Dziwne zachowanie przy rysowaniu pierścienia przy użyciu Path.arcTo() w Androidzie

To jest mój kod na ringu w 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); 

i jest to wynik,

enter image description here

zawiadomienie tutaj, że mogę ustawić sweepAngle do -359 tuż zanim zacznie ona koło. Jednak jeśli zmienię zamiatanie na -360. Wytwarza ten wynik.

enter image description here

Znika !! Ktoś wie, jak rozwiązać ten problem, pomóż mi?

Dzięki.

PS. Nie chcę używać drawArc(), ponieważ chcę zrobić dziurę w pierścieniu. Z numerem drawArc() mój przycisk zniknie.

Odpowiedz

2

Przypuszczam, że Android będzie modował 360, zanim naprawdę go narysuje. Więc x - 360 === x i niczego nie wyciągnie!

+0

Chyba tak .... to jedynym sposobem możemy zrobić, to użyć innego rysunku dla sweepAngel = 360. Tak jak @Kevin powiedział – SaintTail

+0

@SaintTail, to wskazuje na problem, ale nie mówi, jak go pokonać. Dlaczego to jest zaakceptowana odpowiedź? – azizbekian

1

Spóźniam się z tym, ale rozwiązałem go, dodając pełne koło jako ostatnią klatkę animacji (korzystałem z AnimationDrawable, ale w tym przypadku idea jest taka sama). Cały kod remis był taki sam dla tej ostatniej klatki, z wyjątkiem jednej linii:

wymienić:

mPath.arcTo(rectF, startAngle, sweepAngle); 

z czymś takim:

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