Every single shape in this world are made out of simple shapes like circles, triangles and squares. Therefore, there might be situations where a coded shape or graphic can turn out to be much much more useful and flexible and lighter (in terms of the files size) than a normal image file(*.png, *.jpg, etc...). As for this week, I'm going to show you the steps in creating a simple Shape in flex.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import com.shapes.ShapeClass;
import mx.core.UIComponent;
import mx.events.FlexEvent;
//Array to store a list of blue colors
private var blueColorArray:Array = [0xFFFFFF, 0xEEEEFF,
0xDDDDFF, 0xCCCCFF, 0xBBBBFF, 0xAAAAFF,
0x8888FF, 0x6666FF, 0x4444FF, 0x2222FF];
private var blueColorCount:int = 0;
//Array to store a list of black colors
private var blackColorArray:Array = [0xFFFFFF, 0xCCCCCC,
0x999999, 0x666666, 0x333333, 0x000000];
private var blackColorCount:int = 0;
//A timer that will be used to draw the Shapes
//over and over again.
private var timer:Timer = new Timer(100,0);
protected function creationCompleteHandler(event:FlexEvent):void
{
timer.addEventListener(TimerEvent.TIMER, executeTimer);
executeTimer();
}
//Function that will return an array of colors
//based on the starting point, so that the Shapes
//will appear to be animating
private function getBlueColorsArray(tempColorArray:Array,
tempCount:int):Array
{
var tempArray:Array = new Array();
for(var i:int = tempCount;
i < tempColorArray.length; i ++)
{
tempArray.push(tempColorArray[i]);
}
for(i = 0; i < tempCount; i ++)
{
tempArray.push(tempColorArray[i]);
}
return tempArray;
}
//This function will be trigger once the timer has
//run finish a cycle.
private function executeTimer(event:Event = null):void
{
//Stops the timer first.
if(timer.running)
{
timer.stop();
}
//Remove all the graphics and draw a new Shape
layer1.removeAllChildren();
layer1.addChild(ShapeClass.drawCircleTower(50,
getBlueColorsArray(blueColorArray, blueColorCount)));
//Remove all the graphics and draw a new Shape
layer2.removeAllChildren();
layer2.addChild(ShapeClass.drawCircleTower(layer2.width,
getBlueColorsArray(blackColorArray, blackColorCount)));
//As the shape is position at (0,0) we will need to
//reassign the position of the shape everytime we draw
//it so that the shape will always appear on the point
//(10,10).
layer3.removeAllChildren();
var tempDisplayObject:DisplayObject;
tempDisplayObject = layer3.addChild(
ShapeClass.drawCircle(layer3.width/2,
blueColorArray[Math.round(Math.random()*
(blueColorArray.length - 1))],
true));
tempDisplayObject.x = layer3.width/2;
tempDisplayObject.y = layer3.height/2;
blueColorCount ++;
if(blueColorCount >= blueColorArray.length)
{
blueColorCount = 0;
}
blackColorCount ++;
if(blackColorCount >= blackColorArray.length)
{
blackColorCount = 0;
}
timer.start();
}
]]>
</mx:Script>
<mx:Canvas width="100%" height="100%">
<mx:VBox width="100%" height="100%"
verticalAlign="middle"
horizontalAlign="center">
<mx:Canvas id="layer1"/>
</mx:VBox>
<mx:Canvas width="100%" height="100%">
<mx:Canvas id="layer3"
width="150" height="150"
top="10" left="10"/>
<mx:Canvas id="layer2"
width="100" height="100"
right="10" bottom="10"/>
</mx:Canvas>
</mx:Canvas>
</mx:Application>
Source codes for a Shape Class that I have written:
package com.shapes
{
import flash.display.Shape;
import mx.core.UIComponent;
public class ShapeClass
{
public function ShapeClass()
{
}
/**
*
* @param radius - radius of the circle
* @param color - fill color of the circle
* @param createView - do you need this function
* to return a view that can be added to any view
* or a Shape using (0,0) as the midpoint.
* @return either a Shape or a View
*
*/
public static function drawCircle(radius:int,
color:uint,
createView:Boolean = false):*
{
var shape:Shape = new Shape();
shape.graphics.beginFill(color,1);
shape.graphics.drawCircle(0,0,radius);
shape.graphics.endFill();
if(createView)
{
var tempUI:UIComponent = new UIComponent();
tempUI.addChild(shape);
return tempUI;
}else{
return shape;
}
}
/**
*
* @param radius - radius of the circle
* @param colors - an array of colors of this Shape
* @return a view that shows a sequence of Circles
* using (0,0) as the midpoint.
*
*/
public static function drawCircleTower(radius:int,
colors:Array):*
{
var length:int = colors.length;
var diff:Number = radius / length;
var tempUI:UIComponent = new UIComponent();
var tempShape:Shape = null;
for(var i:int = 0; i < length; i ++)
{
tempShape = drawCircle(radius - (i * diff),
colors[i]);
tempUI.addChild(tempShape);
}
return tempUI;
}
}
}
* Click here to view the demo of this example.^ Click here for the source files of this demo.
No comments:
Post a Comment