2010-01-21 19 views
5

मैं अपनी पहली फ्लैश प्रोजेक्ट पर काम कर रहा हूं, और मेरे प्रीलोडर के लिए मैं लोड किए गए प्रतिशत के आधार पर वास्तव में एक सरल ढाल करना चाहता हूं। प्रीलोडर का कहना है कि "77% लोड हो गया ...", जहां नंबर 77 एक गतिशील पाठ उदाहरण है जिसे प्रतिशत लोडेड कहा जाता है। मैं ग्रे-स्केल में # 000000 से #FFFFFF तक ढाल पर बदलने के लिए प्रतिशत लोड किए गए टेक्स्ट का रंग चाहता हूं।आरजीबी ग्रेडियेंट लोड किए गए फ़ाइल के प्रतिशत के आधार पर

इसलिए, मैं बस नहीं कर सकते:

percentLoaded.textColor=(currentValue/100)*0xFFFFFF; 

यह सिर्फ FFFFFF की एक बहु के लिए textcolor बदलता है, लेकिन एक रंग आउटपुट के बाद से यह अलग घटकों नहीं तीन है।

public function rgb2hex(r:Number, g:Number, b:Number) { 
    return '0x'+(r << 16 | g << 8 | b).toString(16).toUpperCase(); 
} 

यह इस तरह नहीं दिखता है वास्तव में के रंग बदल रहा है:

percentLoaded.text=currentValue.toString(); 
percentLoaded.textColor=rgb2hex((currentValue/100)*255, (currentValue/100)*255, (currentValue/100)*255); 

"rgb2hex" कहाँ एक समारोह के रूप में वर्ग के भीतर परिभाषित किया गया है: वर्तमान में, यहाँ मैं क्या आपके पास यह है हालांकि फ़ॉन्ट। मैंने flash.text.TextField और Flash.display.MovieClip आयात किया है, लेकिन मुझे यकीन नहीं है कि मुझे कुछ और याद आ रहा है। स्ट्रिंग concatenation के साथ यह करना आसान होगा? या हो सकता है कि वर्तमान वैल्यू/100 के साथ कुछ चल रहा हो और उसे संख्या के रूप में पास कर रहा हो?

यदि उत्सुक है, तो मुझे rgb2hex here के लिए कोड मिला।

धन्यवाद!

उत्तर

6
percentLoaded.textColor=(currentValue/100)*0xFFFFFF; 

यह करीब है।

ग्रेस्केल पाने के लिए, आप वास्तव में प्रत्येक घटक की आवश्यकता है, लेकिन यह अभी भी तुम्हारा के समान विधि द्वारा किया जा सकता:

percentLoaded.textColor = uint((currentValue/100) * 0xFF) * 0x010101; 
+0

यह काम नहीं करता है। वर्तमान वैल्यू को 1 पर सेट करने का प्रयास करें। आपको 0x28f5c मिलता है। आपको 0x010101 से गुणा करने से पहले एक int में ((वर्तमान वैल्यू/100) * 0xFF) डालने की आवश्यकता है। – Ponkadoodle

+0

सच है, मैं इसके बारे में भूल गया, तय; यह ध्यान देने के लिए धन्यवाद! कलाकार को वास्तव में विभाजन के परिणाम पर जाने की जरूरत है, यही कारण है कि ऐसा होता है - फ्लैश की 'संख्या' कक्षा एक आईईई फ्लोट है। पेश करने के लिए कास्टिंग इसे हल करना चाहिए। – LiraNuna

+1

नहीं, वर्तमान मूल्य 0-100 के बीच है। यदि आप विभाजन के बाद डाले जाते हैं, लेकिन 0xFF द्वारा गुणा करने से पहले, आपको 0 या 1 प्राप्त होगा। वह पूर्ण ग्रेस्केल चाहता है, न केवल काला/सफेद। और समस्या फ्लोटिंग पॉइंट त्रुटियों से उत्पन्न नहीं होती है। ऐसा इसलिए है क्योंकि आपका प्रारूप (* 0x010101) अनिवार्य रूप से तीन फ़ील्ड (01, 01, 01) है। यह किसी अन्य क्षेत्र से किसी अन्य क्षेत्र से प्रभावित होने की अपेक्षा नहीं कर रहा है। लेकिन 255 से अधिक मान का उपयोग करके, कम क्षेत्र को उच्च क्षेत्र को प्रभावित करने की अनुमति मिलती है, और पूर्णांक के बीच एक मान एक उच्च क्षेत्र को कम प्रभावित करने की अनुमति देता है। मेरा मतलब देखने के लिए 1.5 * 0x010101 आज़माएं। – Ponkadoodle

1
percentLoaded.textColor = int((currentValue/100) * 0xFF) * 0x010101; 

0x010101 द्वारा गुणा करने से पहले एक int को कास्ट एक जरूरी है। 8 बिट रंग मान केवल 0-255 के बीच पूर्णांक हो सकते हैं। यदि यह इन सीमाओं के भीतर नहीं है, तो 0x010101 द्वारा गुणा एक रंग घटक (आरआर, जीजी, बीबी) से दूसरे (बी-> जी, जी-> आर) से अधिक प्रवाह का कारण बन सकता है। लेकिन यदि कोई पूर्णांक नहीं है तो वे अन्य तरीके भी ले सकते हैं (आर-> जी, जी-> बी)। मैंने माना है कि वर्तमान वैल्यू 0-100 के बीच कोई संख्या है।

इस पर विचार करें, प्रत्येक अंक अपने आप रंग घटक (दशमलव में) के साथ:

5.0 * 111 = 555 = 5R, 5G, 5B 
5.5 * 111 = 610.5 = 6R, 1G, 0.5B 
1

इस तो आप के लिए आप

percentLoaded.textColor=(currentValue/100)*0xFFFFFF; 

काम करता है बस

var percent = currentValue/100; 
percentLoaded.textColor = Math.floor(percent*0xFF) * 0x010101; 
+0

यह काम नहीं करता है। वर्तमान वैल्यू को 1 पर सेट करने का प्रयास करें। आपको 0x28f5c मिलता है। आपको 0x010101 से गुणा करने से पहले एक int में डालना होगा। – Ponkadoodle

+0

@wallacoloo: ठीक है आप ठीक हैं। – sberry

3

आप भाग्यशाली हैं, मैंने हाल ही में एक परियोजना में ऐसा किया है, केवल भिन्नता के साथ एनटी रंग यहां एक ऐसा फ़ंक्शन है जो 0-1 की सीमा के आधार पर दो अन्य रंगों के बीच रंग मान लौटाएगा। मुझे लगता है कि कोड बहुत आत्म व्याख्यात्मक है, लेकिन अगर आप किसी भी मुद्दे में भाग लेते हैं तो मुझे बताएं।

private function getBetweenColourByPercent(value:Number = 0.5 /* 0-1 */, highColor:uint = 0xFFFFFF, lowColor:uint = 0x000000):uint { 
    var r:uint = highColor >> 16; 
    var g:uint = highColor >> 8 & 0xFF; 
    var b:uint = highColor & 0xFF; 

    r += ((lowColor >> 16) - r) * value; 
    g += ((lowColor >> 8 & 0xFF) - g) * value; 
    b += ((lowColor & 0xFF) - b) * value; 

    return (r << 16 | g << 8 | b); 
} 

टायलर।

+0

धन्यवाद टायलर, यह वास्तव में लाइन के नीचे थोड़ी देर उपयोगी हो सकता है; उदाहरण के लिए, मैं लाल और सफेद के बीच प्रीलोडर टेक्स्ट जाना चुन सकता हूं। – Rockmaninoff