2010-01-21 16 views
5

Pracuję nad moim pierwszym projektem Flash, a dla mojego preloadera chciałbym zrobić naprawdę prosty gradient w oparciu o załadowany procent. Preloader mówi "77% załadowane ...", gdzie numer 77 jest dynamiczną instancją tekstową o nazwie percentLoaded. Chciałbym, aby wartość textColor of percentLoaded zmieniła się na gradiencie z # 000000 na #FFFFFF, w skali szarości.Gradient RGB oparty na procentowym załadowaniu pliku

Dlatego, nie mogę po prostu zrobić:

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

To właśnie konwertuje textColor do wielokrotności FFFFFF, ale wyprowadza kolor, ponieważ jest to nie trzy oddzielne komponenty. Obecnie, oto co mam:

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

Gdzie „rgb2hex” to funkcja zdefiniowana w klasie jako takie:

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

To nie wygląda to rzeczywiście się zmienia kolor czcionka. Zaimportowałem flash.text.TextField i flash.display.MovieClip, ale nie jestem pewien, czy brakuje mi czegoś innego. Czy byłoby to łatwiejsze w przypadku łączenia ciągów? Czy może coś się dzieje z currentValue/100 i przekazujesz to jako numer?

Jeśli ciekawi, znalazłem kod dla rgb2hex here.

Dzięki!

Odpowiedz

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

Jest blisko.

Aby uzyskać skali szarości, to rzeczywiście trzeba mieć każdy komponent, ale to może być nadal wykonywane przez podobną metodę do Ciebie:

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

To nie działa. spróbuj ustawić currentValue na 1. Otrzymasz 0x28f5c. musisz rzucić ((currentValue/100) * 0xFF) do int przed pomnożeniem przez 0x010101. – Ponkadoodle

+0

Prawda, zapomniałem o tym, naprawiono; dziękuję za uwagę! W rzeczywistości obsada musi przejść do wyniku podziału, ponieważ właśnie dlatego tak się dzieje - klasa "Number" klasy Flash to klasa IEE. Przesyłanie do uint powinno rozwiązać problem. – LiraNuna

+1

Nie, bieżąca wartość zawiera się między 0-100. Jeśli rzutujesz po podzieleniu, ale przed pomnożeniem przez 0xFF, otrzymasz 0 lub 1. On chce mieć pełną skalę szarości, a nie tylko czarno-białą. A problem nie wynika z niedokładności zmiennoprzecinkowych. To dlatego, że twój format (* 0x010101) to zasadniczo trzy pola (01, 01, 01). Nie spodziewa się, że coś w jednym polu wpłynie na inne pole. Ale użycie wartości większej niż 255, pozwala niskim polom wpływać na wysokie pole, a wartość pomiędzy liczbami całkowitymi pozwala wysokiemu polu wpływać na niższe pole. Wypróbuj 1.5 * 0x010101, aby zobaczyć co mam na myśli. – Ponkadoodle

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

Rzut na int przed pomnożeniem przez 0x010101 jest koniecznością. 8-bitowe wartości kolorów mogą być wyłącznie liczbami całkowitymi z zakresu od 0 do 255. Jeśli nie mieści się w tych granicach, mnożenie przez 0x010101 może spowodować przepełnienie liczb od jednego składnika koloru (RR, GG, BB) do drugiego (B-> G, G-> R). Ale mogą również przenosić w drugą stronę, jeśli nie jest liczbą całkowitą (R-> G, G-> B). Zakładam, że currentValue to dowolna liczba z zakresu od 0 do 100.

Rozważ to, że z każdej cyfry własnego składowej koloru (w systemie dziesiętnym):

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

Jeśli to działa dla Ciebie

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

Wtedy mogłem po prostu zrobić

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

To nie działa. spróbuj ustawić currentValue na 1. Otrzymasz 0x28f5c. musisz rzutować na int przed pomnożeniem przez 0x010101. – Ponkadoodle

+0

@wallacoloo: Dobrze, naprawione. – sberry

3

Masz szczęście, zdarzyło mi się, że zrobiłem to bardzo niedawno w projekcie, tylko z różnicą kolory nt. Oto funkcja, która zwróci wartość koloru między dwoma innymi kolorami, w oparciu o zakres od 0 do 1. Myślę, że kod jest dość wymowny, ale daj mi znać, jeśli napotkasz jakiekolwiek problemy.

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); 
} 

Tyler.

+0

Dzięki Tyler, może to być przydatne trochę za chwilę; Mogę na przykład zdecydować, aby tekst preloadera zmienił się na czerwony i biały. – Rockmaninoff