Android - Wie zeichne einen Bogen basierten Gradienten
Ich versuche zum erstellen eines Bogens (variable Anzahl von Graden), die allmählich von einer Farbe zu einer anderen. Aus dem Beispiel von blau zu rot:
Dies ist mein code:
SweepGradient shader = new SweepGradient(center.x, center.y, resources.getColor(R.color.startColor),resources.getColor(R.color.endColor));
Paint paint = new Paint()
paint.setStrokeWidth(1);
paint.setStrokeCap(Paint.Cap.FILL);
paint.setStyle(Paint.Style.FILL);
paint.setShader(shader);
canvas.drawArc(rectF, startAngle, sweepAngle, true, paint);
Aber das Ergebnis ist das gesamte arc ist lackiert mit der gleichen Farbe.
Edit:
Nach mehr zu Experimentieren, habe ich herausgefunden, dass die Farbe spread wird bestimmt durch den Winkel des Kreisbogens. Wenn ich zeichnen Sie einen Bogen mit einem kleinen Winkel, wird nur die erste Farbe angezeigt wird. Je größer der Winkel, desto mehr Farben gezeichnet werden. Wenn der Winkel klein ist, es scheint, dass es keinen Farbverlauf.
Hier ist ein Beispiel. Ich bin Zeichnung 4 Bögen - 90, 180, 270 und 360:
RectF rect1 = new RectF(50, 50, 150, 150);
Paint paint1 = new Paint();
paint1.setStrokeWidth(1);
paint1.setStrokeCap(Paint.Cap.SQUARE);
paint1.setStyle(Paint.Style.FILL);
SweepGradient gradient1 = new SweepGradient(100, 100,
Color.RED, Color.BLUE);
paint1.setShader(gradient1);
canvas.drawArc(rect1, 0, 90, true, paint1);
RectF rect2 = new RectF(200, 50, 300, 150);
Paint paint2 = new Paint();
paint2.setStrokeWidth(1);
paint2.setStrokeCap(Paint.Cap.SQUARE);
paint2.setStyle(Paint.Style.FILL);
SweepGradient gradient2 = new SweepGradient(250, 100,
Color.RED, Color.BLUE);
paint2.setShader(gradient2);
canvas.drawArc(rect2, 0, 180, true, paint2);
RectF rect3 = new RectF(50, 200, 150, 300);
Paint paint3 = new Paint();
paint3.setStrokeWidth(1);
paint3.setStrokeCap(Paint.Cap.SQUARE);
paint3.setStyle(Paint.Style.FILL);
SweepGradient gradient3 = new SweepGradient(100, 250,
Color.RED, Color.BLUE);
paint3.setShader(gradient3);
canvas.drawArc(rect3, 0, 270, true, paint3);
RectF rect4 = new RectF(200, 200, 300, 300);
Paint paint4 = new Paint();
paint4.setStrokeWidth(1);
paint4.setStrokeCap(Paint.Cap.SQUARE);
paint4.setStyle(Paint.Style.FILL);
SweepGradient gradient4 = new SweepGradient(250, 250,
Color.RED, Color.BLUE);
paint4.setShader(gradient4);
canvas.drawArc(rect4, 0, 360, true, paint4);
Und hier ist das Ergebnis:
Dies ist überraschend, weil ich erwarten würde, die ROTEN an den start der arc, die BLAUEN am Ende und enything zwischen werden gleichmäßig verteilt, unabhängig von Winkel.
Ich habe versucht, den Raum der Farben, die manuell mithilfe der Positionen parameter, aber die Ergebnisse waren die gleichen:
int[] colors = {Color.RED, Color.BLUE};
float[] positions = {0,1};
SweepGradient gradient = new SweepGradient(100, 100, colors , positions);
Irgendeine Idee, wie man dieses Problem lösen?
InformationsquelleAutor der Frage Yoav | 2012-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung für dieses ist zum einstellen der position von BLAU. Dies geschieht etwa so:
Hier das problem, dass beim festlegen der position von BLAU auf '1' das bedeutet nicht, dass es sich am Ende der gezeichneten Bogen, sondern am Ende des Kreises, von dem der Bogen ein Teil ist.
Um dieses Problem zu lösen, BLAU position sollte berücksichtigt werden, die Anzahl der Grad, in dem arc. Also, wenn ich zeichne einen Kreisbogen mit X Grad, position gesetzt werden, etwa so:
Also, wenn X ist 90, der Verlauf wird Platz BLAU bei 0,25 der Kreis:
InformationsquelleAutor der Antwort Yoav
Hinzufügen Yoav Lösung.
Auf meinem Galaxy Nexus 4.2 stock-Android, die Lösung funktioniert nicht.
Wenn das array keine Elemente enthält, die einer 0.0 f und 1.0 f, es scheint, um ignoriert zu werden.
Meine Letzte Lösung war:
InformationsquelleAutor der Antwort Tom anMoney
fünf Jahre später, aber der richtige Weg ist machen 0.749 f mit 0.750 f der separaten Zeile, einfachen code wie:
InformationsquelleAutor der Antwort zmj110