flex编程动态生成图像

来源:互联网 发布:sql当前时间减一小时 编辑:程序博客网 时间:2024/06/10 16:06

程序需求:动态生成柱形图,柱形条数不确定,柱形字段不确定

 

要动态生成图像必需先把记录转为图像处理所需的格式,以下是处理类

  1. package emtit.utils
  2. {
  3.     import mx.charts.CategoryAxis;
  4.     import mx.charts.series.ColumnSeries;
  5.     import mx.charts.series.PieSeries;
  6.     import mx.collections.ArrayCollection;
  7.     /**
  8.      * author:黄建文
  9.      * data:2008-12-03
  10.      * 图形数据转换类
  11.      */
  12.     public class ChartDataTransform
  13.     {
  14.         
  15.         public function ChartDataTransform()
  16.         {
  17.         }
  18.         
  19.         /**
  20.          *高级图表分析生成,把datagride的数据转换为适合图像显示的数据
  21.          * 返回数据格式如下
  22.          * [{keyword1:'张三',keyword1:'10',keyword3:11},{keyword1:'李四',keyword1:'10',keyword3:11}]
  23.          * 
  24.          */
  25.         public static function advanced(sourceData:Array,xaxis:String,yfield:Array):ArrayCollection{
  26.             var i:int,j:int;
  27.             var obj:Object;
  28.             var name:String,field:String;
  29.             var returnObj:Object = new Object();
  30.             var returnArrC:ArrayCollection=new ArrayCollection;
  31.             var nowname:*=null;
  32.             var isChange:Boolean=false;
  33.             sourceData.sortOn(xaxis);
  34.             for(i=0;i<sourceData.length;i++){
  35.                 for(field in sourceData[i]){
  36.                     name=sourceData[i][xaxis];
  37.                     if(name!=nowname){
  38.                         returnObj[name]=new Object;
  39.                         returnObj[name][xaxis]=sourceData[i][xaxis];
  40.                         nowname=name;
  41.                     }
  42.                     for(j=0;j<yfield.length;j++){
  43.                         if(field==yfield[j]['data']){
  44.                             if(returnObj[name][field]==undefined){
  45.                                 returnObj[name][field]=0;
  46.                             }
  47.                             returnObj[name][field]=parseInt(returnObj[name][field])+parseInt(sourceData[i][field]);
  48.                         //  trace('把这个字段'+yfield[j]['data']+'的值'+sourceData[i][field]+'放到Y轴的一个数组中');
  49.                         }
  50.                     }
  51.                 }
  52.             }
  53.             for each(var num:* in returnObj){
  54.                 returnArrC.addItem(num);
  55.                 for(var field2:String in num){
  56.                     trace(num[xaxis]+'要输出图的字段:'+field2);
  57.                 }
  58.             }
  59.             
  60.             return returnArrC;
  61.         }
  62.         /**
  63.          *设置柱图形categoryField 
  64.          */
  65.         public static function setCategoryAxis(categoryField:String):CategoryAxis{
  66.             var ca:CategoryAxis=new CategoryAxis;
  67.             ca.categoryField=categoryField;
  68.             return ca; 
  69.         }
  70.         /**
  71.          * 设置柱形X轴对应柱状数据
  72.          * xy数组必需为xy=array({lable:'分数',data:'keyword2'},{lable:'只数',data:'keyword3'})
  73.          * displayName要与setCategoryAxis的值对应
  74.          */
  75.         public static function setColumnSeries(yFieldArr:Array,xField:String):Array{
  76.             var cs:ColumnSeries;
  77.             var rsArr:Array=new Array;
  78.             for(var i:int=0;i<yFieldArr.length;i++){
  79.                 cs=new ColumnSeries;
  80.                 cs.displayName=yFieldArr[i]['lable'];
  81.                 cs.xField=xField;
  82.                 cs.yField=yFieldArr[i]['data'];
  83.                 rsArr.push(cs);
  84.                 trace('第'+i+'条柱的属性,displayName:'+cs.displayName+',xField:'+cs.xField+',yField:'+cs.yField);
  85.             }
  86.             return rsArr; 
  87.         }
  88.     }
  89. }

在视图中代码如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" layout="absolute" width="468" height="514" showCloseButton="true" close="PopUpManager.removePopUp(this)">
  3. <mx:Script>
  4.     <![CDATA[
  5.         import mx.automation.delegates.charts.ColumnSeriesAutomationImpl;
  6.         import mx.controls.Label;
  7.         import mx.charts.series.ColumnSeries;
  8.         import mx.charts.chartClasses.Series;
  9.         import mx.collections.ArrayCollection;
  10.         import yes3d.model.MainModel;
  11.         import mx.managers.PopUpManager;
  12.         private function init():void{
  13. //下面这三句是数据转换
  14.            ch_column.dataProvider=MainModel.chartData;
               ch_column.horizontalAxis=ChartDataTransform.setCategoryAxis('xaxis');
               ch_column.series=ChartDataTransform.setColumnSeries([{lable:orderby,data:'value'}],'xaxis');
               
    for(var i:int=0;i<ch_column.series.length;i++){
  15.                 trace('id:'+ch_column.series[i]['id']+',displayName:'+ch_column.series[i]['displayName']+',yfield:'+ch_column.series[i]['yField']+',xfield:'+ch_column.series[i]['xField']);
  16.             }
  17.         }
  18.     ]]>
  19. </mx:Script>
  20.     <mx:ViewStack x="0" y="0" id="vs_chart" width="100%" height="100%">
  21.         <mx:Canvas id="cv_column" label="柱型图" width="100%" height="100%">
  22.             <mx:ColumnChart id="ch_column" showDataTips="true" x="24" y="61" width="399" height="336">
  23.             </mx:ColumnChart>
  24.             <mx:Legend dataProvider="{ch_column}"/>
  25.         </mx:Canvas>
  26.         <mx:Canvas id="cv_pie" label="饼型图" width="100%" height="100%">
  27.             <mx:PieChart id="ch_pie" showDataTips="true" dataProvider="{MainModel.chartData}" x="38" y="48" height="394" width="389">
  28.                 <mx:series>
  29.                     <mx:PieSeries  nameField="xaxis" field="value"/>
  30.                 </mx:series>
  31.             </mx:PieChart>
  32.             <mx:Legend dataProvider="{ch_pie}"/>
  33.         </mx:Canvas>
  34.     </mx:ViewStack>
  35. </mx:TitleWindow>

 

 

原创粉丝点击