2012-11-15 4 views
10

मैं एक SweepGradient के रूप में परिभाषितएंड्रॉयड SweepGradient

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

एक कट्टर परिभाषित यह अच्छी तरह से workes रूप

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

के लिए आवेदन किया है, लेकिन मैं मेहराब की जरूरत है स्क्रीन के ऊपर से बनाना शुरू करने के, यानी

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

समस्या यह है कि स्वीपग्रेडेंट अभी भी 0 डिग्री से शुरू होता है, और मुझे इसे शुरू करने की आवश्यकता है 270 डिग्री (चाप के चित्रण पर किए गए अनुवाद के समान)। दूसरे शब्दों में यदि मेरे पास सफेद से नीले रंग का ढाल है, तो मुझे आर्क पेंट किए गए नीले रंग के आखिरी हिस्से में सफेद रंग की चाप के शीर्ष की आवश्यकता होती है। मैं यह कैसे कर सकता हूँ?

उत्तर

15

शेडर को घूर्णन लागू करने के लिए SweepGradient पर getLocalMatrix() और setLocalMatrix() का उपयोग करने का प्रयास कर सकते हैं। आप वर्तमान मैट्रिक्स प्राप्त कर सकते हैं, उचित रोटेशन postRotate() के साथ पोस्ट करें और फिर इसे शेडर तत्व पर वापस सेट करें।

एक और विकल्प Canvas को इसके बजाय घूमना होगा। आप कैनवास को पूर्व-घुमा सकते हैं, सामग्री खींच सकते हैं, और फिर इसे पुनर्स्थापित कर सकते हैं; या पहले सामग्री खींचें और फिर तथ्य के बाद कैनवास घुमाएं।

+1

धन्यवाद। मैंने आर्क को खींचा और कैनवास को बहाल करने से पहले कैनवास को घुमाया, बाद में एक आकर्षण की तरह काम किया :) – BOENDAGGER

+0

शेडर रोटेशन एक उत्कृष्ट सुझाव था। आपको 'save'/'restore' के साथ @BOENDAGGER ने क्या किया है, इसे करने से आपको राहत मिलती है। एक बार शेडर रोटेशन सेट करें और आप कर लेंगे। – bcorso

8

SweepGradient की उत्पत्ति घूर्णन का उपयोग कर एक 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);