Градиент RGB на основе процента загруженного файла - PullRequest
5 голосов
/ 21 января 2010

Я работаю над своим первым проектом Flash, и для моего предзагрузчика я хотел бы сделать действительно простой градиент на основе загруженного процента. В предварительном загрузчике написано «77% загружено ...», где число 77 - это динамический текстовый экземпляр с именем процентной загрузкой. Я бы хотел, чтобы textColor ofcentLoaded изменялось по градиенту от # 000000 до #FFFFFF в оттенках серого.

Поэтому я не могу просто сделать:

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

Это просто преобразует textColor в кратное FFFFFF, но выводит цвет, так как это не три отдельных компонента. В настоящее время вот что у меня есть:

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

Где "rgb2hex" - это функция, определенная в классе следующим образом:

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

Не похоже, что это на самом деле меняет цвет шрифта. Я импортировал flash.text.TextField и flash.display.MovieClip, но не уверен, что пропустил что-то еще. Будет ли это проще сделать с конкатенацией строк? Или, может быть, что-то происходит с currentValue / 100 и передает это как число?

Если вам интересно, я нашел код для rgb2hex здесь .

Спасибо!

Ответы [ 4 ]

6 голосов
/ 21 января 2010
percentLoaded.textColor=(currentValue/100)*0xFFFFFF;

Это близко.

Чтобы получить оттенки серого, вам действительно нужно иметь каждый компонент, но это можно сделать аналогичным способом:

percentLoaded.textColor = uint((currentValue / 100) * 0xFF) * 0x010101;
3 голосов
/ 21 января 2010

Вам повезло, я сделал это совсем недавно в проекте, только с разными цветами. Вот функция, которая будет возвращать значение цвета между двумя другими цветами, основываясь на диапазоне 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);
}

Тайлер.

1 голос
/ 21 января 2010

Если это работает для вас

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

Тогда вы могли бы просто сделать

var percent = currentValue / 100;
percentLoaded.textColor = Math.floor(percent*0xFF) * 0x010101;
1 голос
/ 21 января 2010
percentLoaded.textColor = int((currentValue / 100) * 0xFF) * 0x010101;

Приведение к int перед умножением на 0x010101 является обязательным. 8-битные значения цвета могут быть только целыми числами от 0 до 255. Если это не в этих пределах, умножение на 0x010101 может привести к переполнению чисел из одного цветового компонента (RR, GG, BB) в другой (B-> G, G-> R). Но они также могут переносить другой путь, если не целое число (R-> G, G-> B). Я предположил, что currentValue - это любое число от 0 до 100.

Учтите это, для каждой цифры свой цветовой компонент (в десятичной форме):

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