2010-01-21 50 views
5

我正在处理我的第一个Flash项目,并且对于我的预加载器,我想根据加载的百分比做一个非常简单的渐变。预加载器说“77%加载...”,其中数字77是一个名为percentLoaded的动态文本实例。我希望percentLoaded的textColor以灰度级从#000000到#FFFFFF的渐变更改。基于加载文件百分比的RGB渐变

因此,我不能简单地做:

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

这只是转换的文字颜色到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 here的代码。

谢谢!

回答

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

这接近。

为了得到一个灰度,你确实需要有各组件,但是这仍然可以通过你的类似的方法来完成:

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

这不起作用。尝试将currentValue设置为1.您将获得0x28f5c。您需要在乘以0x010101之前将((currentValue/100)* 0xFF)强制转换为int。 – Ponkadoodle 2010-01-21 01:05:53

+0

没错,我忘记了,修好了;谢谢你的注意!演员实际上需要继续进行除法结果,因为这就是它发生的原因 - Flash的'Number'类是IEE浮点数。投向uint应该可以解决它。 – LiraNuna 2010-01-21 01:08:14

+1

不,当前值介于0-100之间。如果你在分割之后进行投射,但在乘以0xFF之前,你会得到一个0或1.他想要全灰度,而不仅仅是黑/白。而且这个问题并不是浮点不准确。这是因为你的格式(* 0x010101)基本上是三个字段(01,01,01)。它并不期待一个领域的某些东西受到另一个领域的影响。但是使用大于255的值,允许低场影响高场,而在整数之间的值允许高场影响较低场。试试1.5 * 0x010101来看看我的意思。 – Ponkadoodle 2010-01-21 01:18:42

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

在乘以0x010101之前强制转换为int是必须的。 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 
1

如果这对你的作品

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

然后你可以做

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

这不起作用。尝试将currentValue设置为1.您将获得0x28f5c。您需要在乘以0x010101之前将其转换为int。 – Ponkadoodle 2010-01-21 01:06:53

+0

@wallacoloo:对,你是固定的。 – sberry 2010-01-21 14:55:32

3

你很幸运,我碰巧在一个项目中最近做了这个,只有差别nt颜色。这是一个函数,它将返回两个其他颜色之间的颜色值,基于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); 
} 

Tyler。

+0

谢谢泰勒,这实际上可能会有用一点点,例如,我可能会选择将预加载器文本置于红色和白色之间。 – Rockmaninoff 2010-01-22 16:13:22