Interpolação de cores no Flex
Twitter!
Olá!
Aconteceu aqui, uns tempos atrás, de a gente precisar criar objetos com cores em degradê no Flex. "Flasheiro" que sou, já conhecia a minha classe amiga Color. Porém, como a felicidade de um desenvolvedor sempre dura pouco, descobrimos que essa classe não faz parte da biblioteca padrão do Flex, e precisaria de alguma ginástica para levá-la do Flash para o Flex. Conclusão?! Implementamos a funcionalidade que precisávamos em uma classe simples e usamos.
Veja como ficou a classe e exemplos:
Actionscript:
-
package br.com.dclick
-
{
-
public class ColorUtils
-
{
-
public function ColorUtils()
-
{
-
}
-
-
public static function dismemberColor( color:uint ):Object
-
{
-
-
var o:Object = new Object();
-
-
o.c = color;
-
o.r = Math.floor(color / (256*256));
-
o.g = Math.floor((color - (o.r * 256 * 256)) / 256);
-
o.b = Math.floor(color - (o.r * 256 * 256) - (o.g * 256 ));
-
-
return o;
-
-
}
-
-
public static function interpolateColors( startColor:uint, endColor:uint, progress:Number ):uint
-
{
-
-
var c1:Object = dismemberColor( startColor );
-
var c2:Object = dismemberColor( endColor );
-
-
var r:uint = c1.r - Math.floor(((c1.r - c2.r) * progress));
-
var g:uint = c1.g - Math.floor(((c1.g - c2.g) * progress));
-
var b:uint = c1.b - Math.floor(((c1.b - c2.b) * progress));
-
-
return ( r * 256 * 256 ) + ( g * 256 ) + b;
-
-
}
-
}
-
}
Exemplo de Uso 1:
Source:
XML:
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
-
verticalGap="5" creationComplete="createObjects()"
-
paddingBottom="0" paddingLeft="0" paddingRight="0" paddingTop="0">
-
-
-
<mx:Script>
-
<![CDATA[
-
import mx.controls.Button;
-
import br.com.dclick.ColorUtils;
-
-
[Bindable]
-
private var cor1:uint = 0xFF0000;
-
[Bindable]
-
private var cor2:uint = 0xFFFF00;
-
[Bindable]
-
private var amount:uint = 20;
-
[Bindable]
-
private var gap:uint = 0;
-
[Bindable]
-
private var size:uint = 10;
-
-
-
private function createObjects():void
-
{
-
-
var xmlList:XMLList = xmlData..button;
-
-
container.removeAllChildren();
-
-
for (var i:uint; i <xmlList.length(); i++ )
-
{
-
var node:XML = xmlList[i];
-
-
var btn:Button = new Button();
-
btn.label = node.@label;
-
btn.setStyle( "color", 0xFFFFFF );
-
btn.setStyle( "fillColors",
-
[
-
ColorUtils.interpolateColors( cor1, cor2, 1 / (xmlList.length()-1) * i),
-
ColorUtils.interpolateColors( cor1, cor2, 1 / (xmlList.length()-1) * i),
-
ColorUtils.interpolateColors( cor1, cor2, 1 / (xmlList.length()-1) * i),
-
ColorUtils.interpolateColors( cor1, cor2, 1 / (xmlList.length()-1) * i)
-
]
-
);
-
container.addChild( btn );
-
}
-
-
}
-
-
]]>
-
</mx:Script>
-
-
<mx:XML xmlns="" id="xmlData">
-
-
<buttons>
-
<button label="Test 1" />
-
<button label="Test 2" />
-
<button label="Test 3" />
-
<button label="Test 4" />
-
<button label="Test 5" />
-
<button label="Test 6" />
-
</buttons>
-
-
</mx:XML>
-
-
<mx:ApplicationControlBar width="100%">
-
-
<mx:Label text="Initial Color" />
-
<mx:ColorPicker id="cp1" change="cor1 = cp1.selectedColor; createObjects()" selectedColor="{cor1}"/>
-
<mx:Spacer width="20" />
-
<mx:Label text="End Color" />
-
<mx:ColorPicker id="cp2" change="cor2 = cp2.selectedColor; createObjects()" selectedColor="{cor2}"/>
-
-
</mx:ApplicationControlBar>
-
-
<mx:VBox id="container" width="100%" height="100%" />
-
-
</mx:Application>
Exemplo de Uso 2:
Source:
XML:
-
<?xml version="1.0" encoding="utf-8"?>
-
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
-
verticalGap="0" creationComplete="createObjects()"
-
paddingBottom="0" paddingLeft="0" paddingRight="0" paddingTop="0">
-
-
-
<mx:Script>
-
<![CDATA[
-
import br.com.dclick.ColorUtils;
-
-
[Bindable]
-
private var cor1:uint = 0xFF0000;
-
[Bindable]
-
private var cor2:uint = 0xFFFF00;
-
[Bindable]
-
private var amount:uint = 20;
-
[Bindable]
-
private var gap:uint = 0;
-
[Bindable]
-
private var size:uint = 10;
-
-
-
private function createObjects():void
-
{
-
-
canvas.graphics.clear();
-
-
for( var i:uint = 0; i <amount; i++ )
-
{
-
-
var itemColor:uint = ColorUtils.interpolateColors( cor1, cor2, i / (amount-1) );
-
canvas.graphics.beginFill( itemColor, 1 );
-
canvas.graphics.drawRect(0, i * (size + gap), canvas.width, size );
-
canvas.graphics.endFill();
-
-
}
-
-
}
-
-
]]>
-
</mx:Script>
-
-
<mx:ApplicationControlBar width="100%">
-
-
<mx:Form>
-
<mx:FormItem label="Color 1">
-
<mx:ColorPicker id="cp1" change="cor1 = cp1.selectedColor; createObjects()" selectedColor="{cor1}"/>
-
</mx:FormItem>
-
<mx:FormItem label="Color 2">
-
<mx:ColorPicker id="cp2" change="cor2 = cp2.selectedColor; createObjects()" selectedColor="{cor2}"/>
-
</mx:FormItem>
-
<mx:FormItem label="Amount">
-
<mx:HSlider id="hsAmount" liveDragging="true" minimum="2" maximum="100" value="{amount}" change="amount = hsAmount.value; createObjects();" />
-
</mx:FormItem>
-
<mx:FormItem label="Size">
-
<mx:HSlider id="hsSize" liveDragging="true" minimum="5" maximum="30" value="{size}" change="size = hsSize.value; createObjects();" />
-
</mx:FormItem>
-
<mx:FormItem label="Gap">
-
<mx:HSlider id="hsGap" liveDragging="true" minimum="0" maximum="10" value="{gap}" change="gap = hsGap.value; createObjects();" />
-
</mx:FormItem>
-
</mx:Form>
-
-
</mx:ApplicationControlBar>
-
-
<mx:Canvas id="canvas" width="100%" height="100%" />
-
-
</mx:Application>
Abraço.
3 comentários para “Interpolação de cores no Flex”
Essa classe foi salvadora mesmo! Muito bom!!!!
Muito bom mesmo Paulo, parabéns.
Muito legal Paulo, parabéns!

