2012-11-15 2 views
10

Ich habe eine SweepGradient definiert alsAndroid SweepGradient

circle_paint.setShader(new SweepGradient(getWidth()/2, getHeight()/2, new int[] { circle_start_color, circle_end_color}, new float[] { 0f, 1f})) 

auf einen Bogen angelegt, definiert als

canvas.drawArc(circle_bounds, circle_start_perc*360f, circle_end_perc*360f, true, circle_paint); 

Diese workes gut, aber ich brauche den Bogen von der Spitze zu starten auf dem Bildschirm zeichnen,

dh
canvas.drawArc(circle_bounds, ((circle_start_perc*360f)-90f)%360, circle_end_perc*360f, true, circle_paint); 

das Problem ist, dass der SweepGradient bei 0 Grad noch zu beginnen scheint, und ich brauche es zu starten 270 Grad (ähnlich der Übersetzung auf der Zeichnung des Bogens). Mit anderen Worten, wenn ich einen Farbverlauf von Weiß zu Blau habe, brauche ich die Spitze des Bogens weiß gestrichen und den letzten Teil des Bogens blau. Wie kann ich das machen?

Antwort

15

Sie könnten versuchen, mit getLocalMatrix() und setLocalMatrix() auf dem SweepGradient eine Rotation auf den Shader anzuwenden. Sie können die aktuelle Matrix abrufen, die entsprechende Drehung mit postRotate() posten und sie dann wieder auf das Shader-Element setzen.

Eine andere Option wäre, stattdessen die Canvas zu drehen. Sie können den Canvas-Bereich vordrehen, den Inhalt zeichnen und ihn dann wiederherstellen. oder zeichnen Sie zuerst den Inhalt und drehen Sie dann die Leinwand nach der Tat.

+1

Dank. Ich habe gerade die Leinwand gedreht, bevor ich den Bogen gezeichnet habe und danach die Leinwand restauriert habe, wie ein Zauber :) – BOENDAGGER

+0

Die Shader Rotation war ein ausgezeichneter Vorschlag. Entlastet Sie von dem, was @BOENDAGGER mit dem 'save' /' restore' gemacht hat. Stellen Sie die Shader-Rotation einfach einmal ein und Sie sind fertig. – bcorso

8

den Ursprung des SweepGradient Rotierende mit einem Matrix.preRotate:

final int[] colors = {circle_start_color, circle_end_color}; 
final float[] positions = {0f, 1f}; 
Gradient gradient = new SweepGradient(circle_bounds.centerX(), circle_bounds.centerY(), colors, positions); 
float rotate = 270f; 
Matrix gradientMatrix = new Matrix();   
gradientMatrix.preRotate(rotate, circle_bounds.centerX(), circle_bounds.centerY()); 
gradient.setLocalMatrix(gradientMatrix); 
mPaint.setShader(gradient); 
Verwandte Themen