Main application file:
flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955"
minHeight="600"
xmlns:component="com.component.*"
pageTitle="2008北京奥运会奖牌" viewSourceURL="srcview/index.html">
-->
chart:
/*************************************************
****
**** 黄记新,2010-10-14,下午04:58:40
****
************************************************/
// .==. .==.
// //`^\\ //^`\\
// // ^ ^\\ //^ ^^\\
// //^ ^^ ^\(\__/)/^ ^^ \\
// //^ ^^ ^^ /6 6\ ^ ^^ ^\\
// //^ ^^ ^^ /( .. )\^ ^ ^ ^\\
// // ^^ ^^ /\| V""V |/\^ ^ ^ \\
// // ^^ ^/\/ / `~~` \ \/\^ ^ \\
package com.component
{
import flash.display.Graphics;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.BevelFilter;
import flash.filters.DropShadowFilter;
import flash.utils.Dictionary;
import mx.core.IFactory;
import mx.core.UIComponent;
import spark.components.Group;
import spark.components.Label;
public class ColumnChart extends Group
{
//数据源
[Bindable]
private var _dataProvider:Object;
protected var dataProviderChanged:Boolean;
//渲染器
private var _itemRenderer:IFactory;
//滤镜
private var dropShadowFilter:DropShadowFilter=new DropShadowFilter();
private var bevelFilter:BevelFilter=new BevelFilter();
private var itemToRender:Dictionary;
private var renderToItem:Dictionary;
private var objectsArray:Array=[];
private var colorArray:Array=[];
private var labelArray:Array=[];
private var _verticalTotalValue:Number;
//滤镜
private var dropShadowFil:DropShadowFilter=new DropShadowFilter();
private var lineContainer:Group;
private var lineColor:uint=Math.random()*0xffffff;
public function ColumnChart()
{
//TODO: implement function
super();
itemToRender=new Dictionary(true);
renderToItem=new Dictionary(true);
this.filters=[dropShadowFil];
addEventListener(MouseEvent.ROLL_OVER, onRollOver);
addEventListener(MouseEvent.ROLL_OUT, onRollOut);
}
public function get verticalTotalValue():Number
{
return _verticalTotalValue;
}
public function set verticalTotalValue(value:Number):void
{
_verticalTotalValue=value;
}
/*************************************************
****
**** setter和 getter函数
****
************************************************/
public function get itemRenderer():IFactory
{
return _itemRenderer;
}
public function set itemRenderer(value:IFactory):void
{
_itemRenderer=value;
}
public function get dataProvider():Object
{
return _dataProvider;
}
public function set dataProvider(value:Object):void
{
/*if (_dataProvider == value)
{
return;
}*/
_dataProvider=value;
dataProviderChanged=true;
invalidateProperties();
}
/**
* 创建实例
* @param object
* @return
*/
protected function createItemInstance(object:Object):UIComponent
{
var render:UIComponent=itemRenderer.newInstance() as UIComponent;
if (render is IColumnItemRender)
{
IColumnItemRender(render).data=object;
}
return render;
}
/**
* 移除实例;
* @param object
*/
protected function removeItemInstance(object:Object):void
{
var render:UIComponent=itemToRender[object] as UIComponent;
if (render && this.contains(render))
{
this.removeElement(render);
itemToRender[object]=null;
renderToItem[render]=null;
}
}
/**
* 移除所有实例;
* @param array
*/
protected function removeAllItem(array:Array):void
{
if (array.length == 0)
return;
for (var i:int=0; i array[i]);
}
for (var j:int=0; j array:Array, p:*, value:*):void
{
if (array.length == 0)
return;
for (var i:int=0; i array[i]);
if (render && render.hasOwnProperty(p))
{
render[p]=value;
}
// ISectorItemRender(render).sRadius=value;
}
}
/**
* 创建柱状;
* @param dataProvider
*/
protected function createColumnChart(dataProvider:Object):void
{
if (dataProvider is XML)
{
var arrCol:XML=dataProvider as XML;
var len:int=arrCol.children().length();
var totalValueHeight:Number=height / verticalTotalValue;
trace(totalValueHeight);
var aveHeigh:Number=verticalTotalValue / 20;
//对一个孩子产生随机颜色
generateColor(colorArray, arrCol.children()[0]);
for (var j:int=0; j Array, xml:XML):void
{
for each (var tempXml:XML in xml.children())
{
var color:uint=Math.random() * 0xffffff;
colorArr.push(color);
}
}
protected function setColorAttribute(color:uint, xml:XML):void
{
xml.@color=color;
}
/*************************************************
****
**** 覆盖函数
****
************************************************/
override protected function commitProperties():void
{
super.commitProperties();
if (dataProviderChanged)
{
dataProviderChanged=false;
removeAllItem(objectsArray);
createColumnChart(dataProvider);
}
if (!lineContainer)
{
lineContainer=new Group();
lineContainer.percentHeight=lineContainer.percentW idth=100;
addElementAt(lineContainer, this.numElements);
}
}
private function onRollOut(event:MouseEvent):void
{
lineContainer.graphics.clear();
lineContainer.removeEventListener(Event.ENTER_FRAM E, onEnterFrame);
}
private function onRollOver(event:MouseEvent):void
{
lineContainer.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void
{
drawMouseLine(lineContainer.graphics, event);
}
private function drawMouseLine(g:Graphics, event:Event):void
{
g.clear();
g.lineStyle(2,lineColor);
g.moveTo(0, Group(event.currentTarget).mouseY);
g.lineTo(Group(event.currentTarget).width, Group(event.currentTarget).mouseY);
/*g.moveTo(Group(event.currentTarget).mouseX, height);
g.lineTo(Group(event.currentTarget).mouseX, 0);*/
}
/**
* 响应条目项点击
* @param event
*/
private function onClick(event:MouseEvent):void
{
var render:UIComponent=event.currentTarget as UIComponent;
var object:Object=getItem(event.currentTarget as UIComponent);
if (!object)
{
return;
}
//派发条目点击事件
object.render=event.currentTarget as UIComponent;
dispatchEvent(new ColumnChartEvent(ColumnChartEvent.ITEM_CLICK, object));
}
private function getItem(render:UIComponent):Object
{
return renderToItem[render] as Object;
}
private function getRender(object:Object):UIComponent
{
return itemToRender[object] as UIComponent;
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
var totalValueHeight:Number=height / verticalTotalValue;
var averageHeigh:Number=verticalTotalValue / 10;
this.graphics.lineStyle(1, 0x123456);
this.graphics.moveTo(-5, height);
this.graphics.lineTo(-5, height - verticalTotalValue * totalValueHeight);
/*this.graphics.moveTo(-5, height+1);
this.graphics.lineTo(width, height+1);*/
for (var i:int=0; i
flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="false"
implements="com.component.IColumnItemRender">
Array=[];
private var labelDataArray:Array=[];
private var xml:XML;
[Bindable]
override public function get data():Object
{
return _data;
}
override public function set data(value:Object):void
{
if (_data == value)
{
return;
}
_data=value;
dataChanged=true;
invalidateProperties();
}
override protected function commitProperties():void
{
super.commitProperties();
if (dataChanged)
{
dataChanged=false;
this.width=data.width;
this.height=data.height;
xml=data.xml;
for (var i:int=0; i
/*************************************************
****
**** 黄记新,2010-10-12,下午04:33:13
****
************************************************/
package com.component
{
public interface IColumnItemRender
{
function get data():Object;
function set data(object:Object):void;
}
}
flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955"
minHeight="600"
xmlns:component="com.component.*"
pageTitle="2008北京奥运会奖牌" viewSourceURL="srcview/index.html">
-->
chart:
/*************************************************
****
**** 黄记新,2010-10-14,下午04:58:40
****
************************************************/
// .==. .==.
// //`^\\ //^`\\
// // ^ ^\\ //^ ^^\\
// //^ ^^ ^\(\__/)/^ ^^ \\
// //^ ^^ ^^ /6 6\ ^ ^^ ^\\
// //^ ^^ ^^ /( .. )\^ ^ ^ ^\\
// // ^^ ^^ /\| V""V |/\^ ^ ^ \\
// // ^^ ^/\/ / `~~` \ \/\^ ^ \\
package com.component
{
import flash.display.Graphics;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.BevelFilter;
import flash.filters.DropShadowFilter;
import flash.utils.Dictionary;
import mx.core.IFactory;
import mx.core.UIComponent;
import spark.components.Group;
import spark.components.Label;
public class ColumnChart extends Group
{
//数据源
[Bindable]
private var _dataProvider:Object;
protected var dataProviderChanged:Boolean;
//渲染器
private var _itemRenderer:IFactory;
//滤镜
private var dropShadowFilter:DropShadowFilter=new DropShadowFilter();
private var bevelFilter:BevelFilter=new BevelFilter();
private var itemToRender:Dictionary;
private var renderToItem:Dictionary;
private var objectsArray:Array=[];
private var colorArray:Array=[];
private var labelArray:Array=[];
private var _verticalTotalValue:Number;
//滤镜
private var dropShadowFil:DropShadowFilter=new DropShadowFilter();
private var lineContainer:Group;
private var lineColor:uint=Math.random()*0xffffff;
public function ColumnChart()
{
//TODO: implement function
super();
itemToRender=new Dictionary(true);
renderToItem=new Dictionary(true);
this.filters=[dropShadowFil];
addEventListener(MouseEvent.ROLL_OVER, onRollOver);
addEventListener(MouseEvent.ROLL_OUT, onRollOut);
}
public function get verticalTotalValue():Number
{
return _verticalTotalValue;
}
public function set verticalTotalValue(value:Number):void
{
_verticalTotalValue=value;
}
/*************************************************
****
**** setter和 getter函数
****
************************************************/
public function get itemRenderer():IFactory
{
return _itemRenderer;
}
public function set itemRenderer(value:IFactory):void
{
_itemRenderer=value;
}
public function get dataProvider():Object
{
return _dataProvider;
}
public function set dataProvider(value:Object):void
{
/*if (_dataProvider == value)
{
return;
}*/
_dataProvider=value;
dataProviderChanged=true;
invalidateProperties();
}
/**
* 创建实例
* @param object
* @return
*/
protected function createItemInstance(object:Object):UIComponent
{
var render:UIComponent=itemRenderer.newInstance() as UIComponent;
if (render is IColumnItemRender)
{
IColumnItemRender(render).data=object;
}
return render;
}
/**
* 移除实例;
* @param object
*/
protected function removeItemInstance(object:Object):void
{
var render:UIComponent=itemToRender[object] as UIComponent;
if (render && this.contains(render))
{
this.removeElement(render);
itemToRender[object]=null;
renderToItem[render]=null;
}
}
/**
* 移除所有实例;
* @param array
*/
protected function removeAllItem(array:Array):void
{
if (array.length == 0)
return;
for (var i:int=0; i array[i]);
}
for (var j:int=0; j array:Array, p:*, value:*):void
{
if (array.length == 0)
return;
for (var i:int=0; i array[i]);
if (render && render.hasOwnProperty(p))
{
render[p]=value;
}
// ISectorItemRender(render).sRadius=value;
}
}
/**
* 创建柱状;
* @param dataProvider
*/
protected function createColumnChart(dataProvider:Object):void
{
if (dataProvider is XML)
{
var arrCol:XML=dataProvider as XML;
var len:int=arrCol.children().length();
var totalValueHeight:Number=height / verticalTotalValue;
trace(totalValueHeight);
var aveHeigh:Number=verticalTotalValue / 20;
//对一个孩子产生随机颜色
generateColor(colorArray, arrCol.children()[0]);
for (var j:int=0; j Array, xml:XML):void
{
for each (var tempXml:XML in xml.children())
{
var color:uint=Math.random() * 0xffffff;
colorArr.push(color);
}
}
protected function setColorAttribute(color:uint, xml:XML):void
{
xml.@color=color;
}
/*************************************************
****
**** 覆盖函数
****
************************************************/
override protected function commitProperties():void
{
super.commitProperties();
if (dataProviderChanged)
{
dataProviderChanged=false;
removeAllItem(objectsArray);
createColumnChart(dataProvider);
}
if (!lineContainer)
{
lineContainer=new Group();
lineContainer.percentHeight=lineContainer.percentW idth=100;
addElementAt(lineContainer, this.numElements);
}
}
private function onRollOut(event:MouseEvent):void
{
lineContainer.graphics.clear();
lineContainer.removeEventListener(Event.ENTER_FRAM E, onEnterFrame);
}
private function onRollOver(event:MouseEvent):void
{
lineContainer.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void
{
drawMouseLine(lineContainer.graphics, event);
}
private function drawMouseLine(g:Graphics, event:Event):void
{
g.clear();
g.lineStyle(2,lineColor);
g.moveTo(0, Group(event.currentTarget).mouseY);
g.lineTo(Group(event.currentTarget).width, Group(event.currentTarget).mouseY);
/*g.moveTo(Group(event.currentTarget).mouseX, height);
g.lineTo(Group(event.currentTarget).mouseX, 0);*/
}
/**
* 响应条目项点击
* @param event
*/
private function onClick(event:MouseEvent):void
{
var render:UIComponent=event.currentTarget as UIComponent;
var object:Object=getItem(event.currentTarget as UIComponent);
if (!object)
{
return;
}
//派发条目点击事件
object.render=event.currentTarget as UIComponent;
dispatchEvent(new ColumnChartEvent(ColumnChartEvent.ITEM_CLICK, object));
}
private function getItem(render:UIComponent):Object
{
return renderToItem[render] as Object;
}
private function getRender(object:Object):UIComponent
{
return itemToRender[object] as UIComponent;
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
var totalValueHeight:Number=height / verticalTotalValue;
var averageHeigh:Number=verticalTotalValue / 10;
this.graphics.lineStyle(1, 0x123456);
this.graphics.moveTo(-5, height);
this.graphics.lineTo(-5, height - verticalTotalValue * totalValueHeight);
/*this.graphics.moveTo(-5, height+1);
this.graphics.lineTo(width, height+1);*/
for (var i:int=0; i
flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="false"
implements="com.component.IColumnItemRender">
Array=[];
private var labelDataArray:Array=[];
private var xml:XML;
[Bindable]
override public function get data():Object
{
return _data;
}
override public function set data(value:Object):void
{
if (_data == value)
{
return;
}
_data=value;
dataChanged=true;
invalidateProperties();
}
override protected function commitProperties():void
{
super.commitProperties();
if (dataChanged)
{
dataChanged=false;
this.width=data.width;
this.height=data.height;
xml=data.xml;
for (var i:int=0; i
/*************************************************
****
**** 黄记新,2010-10-12,下午04:33:13
****
************************************************/
package com.component
{
public interface IColumnItemRender
{
function get data():Object;
function set data(object:Object):void;
}
}