2012-11-15 7 views
10

Ho una SweepGradient definito comeAndroid SweepGradient

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

applicata ad un arco definito come

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

Questo workes bene, ma devo l'arco per iniziare a disegnare dalla parte superiore dello schermo, cioè

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

il problema è che lo SweepGradient sembra iniziare ancora a 0 gradi, e ho bisogno iniziare alle 270 gradi (simile alla traduzione fatta sul disegno dell'arco). In altre parole, se ho una sfumatura dal bianco al blu, ho bisogno che la parte superiore dell'arco sia dipinta di bianco e l'ultima parte dell'arco sia dipinta di blu. Come posso fare questo?

risposta

15

Si potrebbe provare a utilizzare getLocalMatrix() e setLocalMatrix() su SweepGradient per applicare una rotazione allo shader. È possibile ottenere la matrice corrente, postare la rotazione appropriata con postRotate() e quindi reimpostarla sull'elemento shader.

Un'altra opzione sarebbe quella di ruotare il Canvas invece. È possibile pre-ruotare la tela, disegnare il contenuto e quindi ripristinarlo; o disegnare prima il contenuto e quindi ruotare la tela dopo il fatto.

+1

Grazie. Ho appena ruotato la tela prima di disegnare l'arco e di ripristinare la tela in seguito, ha funzionato come un fascino :) – BOENDAGGER

+0

La rotazione dello shader è stata un eccellente suggerimento. Ti allevia di dover fare ciò che ha fatto @BOENDAGGER con 'save' /' restore'. Basta impostare la rotazione dello shader una volta e il gioco è fatto. – bcorso

8

rotazione l'origine del SweepGradient utilizzando un 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); 
Problemi correlati