« De fmx2004 y componentes | Main | 20miligramos de kike, lupis y róger »

May 21, 2004, 07:37 AM

tween de color.

he visto ultimamente en varios sites, cambios de colores con suavizados, si bien es fácil de hacer, es un efecto que se ve bien.

el truco consiste en asignar valores r, g, b iniciales y finales, hacer el cálculo y luego convertilo a hexadecimal, luego de esto, cambiar el color al clip.

aquí un código de ejemplo, utilizando la clase tween de fmx2004, para una vida más simple y feliz

copiar, pegar y probar =)

//clase tween fmx2004
import mx.effects.Tween;
//funcion que cambia de RGB a hexadecimal.
function rgb2hex (r:Number,g:Number,b:Number):Number{
   return r << 16 | g << 8 | b;
}
/*

dibuja un rectangulo

recibe un clip, x, y, alto y ancho

*/
function drawRect(c:MovieClip, x:Number, y:Number, ancho:Number, alto:Number):Void{ with&#169;{ moveTo(x,y); lineTo(ancho,y1); lineTo(ancho,alto); lineTo(x,alto); lineTo(x,y); } } //callbak para el tween onTweenUpdate = function(val : Array) : Void { //asignamos el nuevo color. myCol.setRGB(rgb2hex(val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn0" rel="external">0</a></sup>,val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn1" rel="external">1</a></sup>,val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn2" rel="external">2</a></sup>)); } //callban para el tween end. onTweenEnd = function (val : Array) : Void { //asignamos el nuevo color. myCol.setRGB(rgb2hex(val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn0" rel="external">0</a></sup>,val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn1" rel="external">1</a></sup>,val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn2" rel="external">2</a></sup>)); //los colores actuales ser&aacute;n los iniciales de la proxima vez. clip.R = val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn0" rel="external">0</a></sup>; clip.G = val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn1" rel="external">1</a></sup>; clip.B = val<sup class="footnote"><a href="http://www.kadazuro.com/blog/archives/000061.php#fn2" rel="external">2</a></sup>; //el se&ntilde;or est&aacute; desocupado ahora. clip.busy = false; } //funcion invocada por los botones. setColor = function (i:Number):Void{ if(!clip.busy){ //sacamos los respectis rgb en base al indicie y el array colores. var R = colores[i].R; var G = colores[i].G; var B = colores[i].B; //no mas press por el momento. clip.busy = true; //tween. myTween = new Tween(this, [clip.R,clip.G,clip.B], [R,G,B], 500); } } //crea los botones, recibe un indice. function createBtn(n:Number):Void{ var c = this.createEmptyMovieClip("btn"+n,getNextHighestDepth()); //acomoda en y c._y = 102; //acomoda en c. c._x = 0 +( n*20 ); //este lo usamos luego, para asignar el color en el tween. c.index = n; //lo pintamos usando el array colores y el indice en que vamos. c.beginFill(rgb2hex(colores[n].R,colores[n].G,colores[n].B),100); //dibujamos el rect del boton. drawRect(c,0,0,18,18); c.endFill(); //funcion a ejecutar al ser presionado. c.onPress = function (){ //aqui le pasar&aacute; el index a la funcion en root. //el que usar&aacute; para setear el nuevo color. this._parent.setColor(this.index); }; } //este es el clip que cambiar&aacute; de color. this.createEmptyMovieClip("clip",getNextHighestDepth()) //lo pintamos de negro clip.beginFill(0,100); //le dibujamos un cuadro drawRect(clip,0,0,98,98); //teminamos de pintar. clip.endFill(); //colores Iniciales, para el clip principal. clip.R = 0; clip.G = 0; clip.B = 0; //objeto de color con target en nuestro clip. myCol = new Color(clip) //flag de ocupado en false, para deshabilitar botones. clip.busy = false; //colores colores = [{R:255,G:204,B:51},{R:0,G:102,B:153},{R:0,G:153,B:0},{R:153,G:0,B:51},{R:102,G:102,B:102}]; //crea los botones en base al largo de array colores. for ( var n = 0; n &lt; colores.length; n ++){ createBtn (n) } stop();

Posted by kada

Comentarios

1Jesús , (May 21, 2004 02:05 PM):

Muy bien pensado y explicado, y con esos comments mucho más.

Felicidades Kada.

pd: Se extrañaban esos tutoriales tuyos. :)

2Nico , (May 21, 2004 04:14 PM):

Excelente la explicación como siempre.

Saludos,

3raul , (May 21, 2004 04:42 PM):

very nice =)

4dago135 , (May 29, 2004 04:49 PM):

un 100 como siempre kada!! thanx

5Carlos Rovira , (May 30, 2004 04:42 PM):

Muy ilustrativo el ejemplo, gracias!. :)

6Mono , (June 4, 2004 02:05 AM):

Buena explicacion!

No es más fácil usando setTransform()? Ahi te ahorras la conversión a HEX. Solo trabajas con RGB y los valores Alpha para cada color.

new Color(MC).setTransform({ra:-100, rb:255, ba:-100, bb:255, ga:-100, gb:255, aa:100, ab:0});

7NibblesMX , (June 6, 2004 10:44 PM):

yo hice algo parecido, pero con setTransform como dice mono.

www.danov.com/~evilnibble/color.html