2010-01-21 10 views
5

Estoy trabajando en mi primer proyecto de Flash, y para mi preloader me gustaría hacer un degradado muy simple basado en el porcentaje cargado. El precargador dice "77% cargado ...", donde el número 77 es una instancia de texto dinámico llamada percentLoaded. Me gustaría que el textColor de percentLoaded cambie en un gradiente de # 000000 a #FFFFFF, en escala de grises.gradiente RGB basado en el porcentaje de archivo cargado

Por lo tanto, no puedo simplemente hacer:

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

Esto se convierte la textColor a un múltiplo de FFFFFF, pero da salida a un color ya que es menos de tres componentes separados. En la actualidad, esto es lo que tengo:

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

Donde "rgb2hex" es una función definida dentro de la clase como tal:

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

No se ve como esto está cambiando en realidad el color de la fuente sin embargo. He importado flash.text.TextField y flash.display.MovieClip, pero no estoy seguro de si me falta algo más. ¿Esto sería más fácil de hacer con la concatenación de cadenas? ¿O tal vez está pasando algo con currentValue/100 y pasándolo como un Número?

Si es curioso, encontré el código para rgb2hex here.

Gracias!

Respuesta

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

Esto está cerca.

Para obtener una escala de grises, de hecho necesita tener cada componente, pero esto todavía se puede hacer mediante un método similar de los suyos:

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

Esto no funciona. intente establecer currentValue en 1. Obtiene 0x28f5c. necesita convertir ((actualValor/100) * 0xFF) a un int antes de multiplicar por 0x010101. – Ponkadoodle

+0

Es cierto, me olvidé de eso, reparado; gracias por notar eso! El elenco realmente necesita seguir el resultado de la división, ya que es por eso que sucede - La clase 'Number' de Flash es un flotante IEE. Casting to uint debería resolverlo. – LiraNuna

+1

No, el valor actual está entre 0-100. Si lanzas después de dividir, pero antes de multiplicar por 0xFF, obtendrás un 0 o un 1. Quiere una escala de grises completa, no solo negro/blanco. Y el problema no surge de imprecisiones de coma flotante. Es porque su formato (* 0x010101) es esencialmente tres campos (01, 01, 01). No se espera que algo en un campo sea influenciado por otro campo. Pero al usar un valor mayor que 255, permite que un campo bajo influya en un campo alto, y un valor entre enteros permite que un campo alto influya en un campo inferior. Prueba 1.5 * 0x010101 para ver a qué me refiero. – Ponkadoodle

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

El lanzamiento a un int antes de multiplicar por 0x010101 es obligatorio. Los valores de color de 8 bits solo pueden ser enteros entre 0-255. Si no está dentro de estos límites, la multiplicación por 0x010101 podría causar que los números se desborden de un componente de color (RR, GG, BB) a otro (B-> G, G-> R). Pero también pueden llevar a otro lado si no es un número entero (R-> G, G-> B). Supuse que currentValue es cualquier número entre 0-100.

consideran este, en donde cada dígito es propio componente de color (en decimal):

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

Si esto funciona para usted

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

A continuación, podría simplemente hacer

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

Esto no funciona. intente establecer currentValue en 1. Obtiene 0x28f5c. necesitas lanzar a un int antes de multiplicar por 0x010101. – Ponkadoodle

+0

@wallacoloo: Correcto, fijo. – sberry

3

Estás de suerte, he hecho esto muy recientemente en un proyecto, solo con diferentes nt colores. Aquí hay una función que devolverá un valor de color entre otros dos colores, según un rango de 0-1. Creo que el código es bastante explicativo, pero avíseme si se encuentra con algún problema.

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

Gracias Tyler, esto puede ser útil un poco más adelante; Podría elegir que el texto del precargador vaya entre rojo y blanco, por ejemplo. – Rockmaninoff

Cuestiones relacionadas