Canvas.drawArc () Artefakte

8

Ich zeichne einen Bogen auf Leinwand in einer benutzerdefinierten Ansicht, wie unten gezeigt. Paint und rectangle werden außerhalb von onDraw() definiert und zur Vereinfachung hinzugefügt.

%Vor%

Wenn ich diesen Code auf dem Galaxy Nexus mit 4.3 austrage, gibt es folgende Artefakte.

Es gibt keine solchen Artefakte, wenn man auf dem Nexus 5 mit 4.4.4 läuft.

Ich beobachtete solche Artefakte nur durch Winkel wie (225f, 315f) und einige andere Winkel. Meistens hat der Lichtbogen eine korrekte Form.

Gibt es eine Möglichkeit, diese Artefakte zu vermeiden?

Update: Ich habe versucht, Software, Hardware und keine Ebenen mit setLayerType() zu verwenden. Artefakte änderten ihre Form, waren aber immer noch präsent.

    
sergej shafarenka 06.08.2014, 00:43
quelle

2 Antworten

2

Ich bin ein StackOverflow-Neuling, wollte einen Kommentar hinzufügen, konnte aber nicht (mit unzureichenden Punkten) also musste meinen Kommentar in eine Antwort setzen!

Eine merkwürdige Sache ist, dass der Lichtbogen die spezifizierte Endposition mit einer geraden vertikalen Linie an der Außenseite überschwingt. Der innere Endpunkt scheint in Ordnung zu sein. Natürlich sagen dieses und das andere Durcheinander von Linien nicht, was das Problem verursacht.

Es scheint zu erscheinen, wenn der Endwinkel bei genau ein Vielfaches von 90 Grad ist. Das sieht aus wie ein numerischer Berechnungsfehler, Rundungsfehler usw. @kcoppock bemerkte, dass 314.98f den Fehler bereits umgeht. Wahrscheinlich jeder Wert anders als genau 315.0f kann den Trick tun.

Wenn Code-Optimierung beteiligt ist (Versuche, den Bogen in so wenig Liniensegmenten wie möglich zu zeichnen), kann ein weiterer Trick darin bestehen, den Bogen zu vereinfachen, indem man ihn in Stücke schneidet - & gt; Verwenden Sie mehrere drawArc-Aufrufe, die jeweils einen bestimmten maximalen Winkel umfassen. Kandidaten sind 30, 45, 90 und 180 Grad. Bleibt zu sehen, wenn die Gelenke unsichtbar sein werden ...

Es ist ein bisschen weit weg, hoffe, dass einer dieser Vorschläge funktioniert.

    
Paul1n 27.08.2014, 13:58
quelle
0

Ich habe die Lösung gefunden! :)

Statt dessen:

%Vor%

Verwenden Sie dies:

%Vor%

Dieser Code führt zu einem langsameren Lauf, erzeugt jedoch keine Artefakte. :)

    
György Benedek 22.09.2016 12:19
quelle