Interpolação de cores no Flex
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!
Adicionar comentário
Essa classe foi salvadora mesmo! Muito bom!!!!
Muito bom mesmo Paulo, parabéns.
Muito legal Paulo, parabéns!

