1.該圖表的資料來源為ArrayCollection類型的arrayC
2.每增加一條線,其實就是增加一個資料來源中的ArrayCollection每個對象的一個屬性,且屬性名稱不能重複
3.修改ArrayCollection後,同時修改LineChart的series
執行個體中,新增,即為新增一個line的資料ArrayCollection,裡面對象的結構為 ,時間Date,裝置名稱(“裝置+隨機數”),時間的值是1-12小時,裝置名稱的值是一個隨機數
private function createArray():ArrayCollection{var ac:ArrayCollection = new ArrayCollection();var name:String = "裝置"+ Math.floor(Math.random()*10); for(var i:int=0;i<12;i++){var o:Object = new Object();o.Date = i+"時";o[name] = Math.floor(Math.random()*10);ac.addItem(o);}return ac;}
而後判斷,如果是新增line,直接將該ArrayCollection作為lineChart的資料來源;否則修改lineChart的資料來源,將新增line裝置名稱屬性,作為lineChart的資料來源的一個新屬性
此時出現的問題是,新增一個line的資料ArrayCollection的對象除了時間Date是固定的,其他屬性(裝置名稱) 其實是動態產生的,也就說,這是個動態對象。要擷取動態對象的屬性方法如下
/** 返回對象的某個屬性名稱 * @author kkkloveyou 2012-10-23 * @param obejct 動態對象 * @param index 要擷取第幾個對象的屬性 * @return name */public function getObjectProperties(obejct:Object,index:int):String{ var objInfo:Object = ObjectUtil.getClassInfo(obejct); //擷取到對象的屬性列表var fieldName:Array = objInfo["properties"] as Array; return fieldName[index];}
ObjectUtil 類是一個全靜態類,["properties"]可以返回對象屬性的數組,只要知道屬性在對象中的排位,就可以獲得該屬性名稱 ,動態產生資料來源如下:
/*判斷 資料來源是否為空白,為空白直接放入第一個ArrayCollection對象 ,否則 將自己的第二個屬性值加入到資料來源中*/if(arrayC.length>0){var newAc:ArrayCollection = createArray();for(var a:String in arrayC){for(var b:String in newAc){if(arrayC[a].Date ==newAc[b].Date){var name :String = getObjectProperties(newAc[b] ,1);arrayC[a][name] = newAc[b][name];trace("增加屬性:"+newAc[b][name]);break;}}}}else{arrayC = createArray(); }/*根據資料來源動態產生線*//*1.取出每個要增加對象的屬性 name *//* 拿到ArrayCollection的第一個對象,就可以拿到他的所有屬性名稱*/var obejct:Object = arrayC.getItemAt(0);var objInfo:Object = ObjectUtil.getClassInfo(obejct); var fieldNames:Array = objInfo["properties"] as Array; var newFileNames:Array = []; for each(var q:String in fieldNames){ if(q!="Date"){newFileNames.push(q);}}
資料來源更新了以後,只需要按照資料來源arrayC中對象屬性名稱,產生相應的LineSeries,並將LineSeries 添加到LineChart的series即刻
/*2.根據name 取出相應 對象值*/array = [];for(var b:String in newFileNames){var lineSeries:LineSeries=new LineSeries(); //設定圖表的系列lineSeries.xField="Date"lineSeries.yField = newFileNames[b];lineSeries.displayName = newFileNames[b];lineSeries.setStyle("form", "curve"); //lineSeries.setStyle("lineStroke",s1);//替換或者新增array.push( lineSeries );} myChart.series = array;//給圖表系列賦值
移除一條line的過程是相反的,也是類似,首先修改資料來源的arrayC,將要移除的屬性刪除,而後相應的修改myChart.series
/** 移除資料 * @author kkkloveyou 2012-10-23 * @return name 要刪除的屬性名稱 */private function removeFromArray(name:String):void{for(var a:String in arrayC){trace("刪除屬性:"+arrayC[a][name]);delete arrayC[a][name];}array = [];for(var b:String in myChart.series){if(myChart.series[b].yField !=name){array.push(myChart.series[b]); }}myChart.series = array ;legend_id.dataProvider = myChart; }
完整執行個體 下載 地址:http://download.csdn.net/detail/kkkloveyou/4705198