`
luhantu
  • 浏览: 200132 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex chart 改变图表元素的颜色

    博客分类:
  • Flex
阅读更多

Flex 有许许多多的chart组件,他们的父类都是ChartBase。ChartBase下面有两个直接子类:CartesianChart 和 PolarChart。除了PieChart 继承自PolarChart外,其他的chart图形都继承自CartesianChart。因此如果像改变图表元素的颜色的话,就需要对这两种类型的chart做不同的处理。

在下面的例子里,我们在lengend 做一下定制来得到我们想要的结果。

主程序:

 

<?xml version="1.0"?>
<!-- Simple example to demonstrate the PieChart control. -->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx">
	<fx:Script>
		<![CDATA[          
			import mx.charts.HitData;
			import mx.charts.series.PieSeries;
			import mx.charts.series.items.PieSeriesItem;
			import mx.collections.ArrayCollection;
			
			[Bindable]
			private var medalsAC:ArrayCollection = new ArrayCollection( [
				{ Country: "USA", Gold: 35, Silver:39, Bronze: 29 },
				{ Country: "China", Gold: 32, Silver:17, Bronze: 14 },
				{ Country: "Russia", Gold: 27, Silver:27, Bronze: 38 } ]);
			
			private function dataTipFunction(hitData:HitData):String
			{
				 var temp:String= (" " + (hitData.chartItem as PieSeriesItem).percentValue).substr(0,6);
				 //对于PieChart来说,PieSeriesItem有一个percentValue的值来标记百分比
				return hitData.item[(hitData.element as PieSeries).nameField] + "(" + temp + "%)"; 
			}
		]]>
	</fx:Script>
	<s:layout>
		<s:VerticalLayout/>
	</s:layout>
	<mx:VDividedBox width="100%" height="100%">
		<mx:Panel title="Pie Chart" height="100%" width="100%">
			<mx:PieChart id="chart" 
						 height="100%" 
						 width="100%"
						 paddingRight="5" 
						 paddingLeft="5" 
						 showDataTips="true" 
						 dataTipFunction="dataTipFunction"
						 dataProvider="{medalsAC}">          
				<mx:series>
					<mx:PieSeries 
						nameField="Country"
						labelPosition="callout" 
						field="Silver">
						<mx:filters>
							<fx:Array/>
						</mx:filters>
					</mx:PieSeries>
				</mx:series>
			</mx:PieChart>  
			<mx:Legend dataProvider="{chart}" legendItemClass="com.skin.PolarLegendItem"/>
		</mx:Panel>
		<mx:Panel title="Column Chart" height="100%" width="100%">
			<mx:ColumnChart id="column" 
							height="100%" 
							width="45%" 
							paddingLeft="5" 
							paddingRight="5" 
							showDataTips="true" 
							dataProvider="{medalsAC}"
							>                
				<mx:horizontalAxis>
					<mx:CategoryAxis categoryField="Country"/>
				</mx:horizontalAxis>
				<mx:series>
					<mx:ColumnSeries 
						xField="Country" 
						yField="Gold" 
						displayName="Gold"
						/>
					<mx:ColumnSeries 
						xField="Country" 
						yField="Silver" 
						displayName="Silver"
						/>
					<mx:ColumnSeries 
						xField="Country" 
						yField="Bronze" 
						displayName="Bronze"
						/>
				</mx:series>
			</mx:ColumnChart>
			<mx:Legend dataProvider="{column}" legendItemClass="com.skin.CartesianLegendItem"/>
		</mx:Panel>
	</mx:VDividedBox>
</s:Application>
 CartesianLegendItem:
package com.skin
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	import mx.charts.LegendItem;
	import mx.charts.chartClasses.ChartElement;
	import mx.charts.chartClasses.GraphicsUtilities;
	import mx.charts.chartClasses.StackedSeries;
	import mx.charts.renderers.BoxItemRenderer;
	import mx.charts.series.ColumnSeries;
	import mx.charts.series.LineSeries;
	import mx.charts.series.PieSeries;
	import mx.controls.ColorPicker;
	import mx.core.IDataRenderer;
	import mx.core.IFlexDisplayObject;
	import mx.core.IInvalidating;
	import mx.core.UIComponent;
	import mx.events.DropdownEvent;
	import mx.graphics.IFill;
	import mx.graphics.SolidColor;
	import mx.graphics.SolidColorStroke;
	import mx.graphics.Stroke;
	import mx.skins.ProgrammaticSkin;
	import mx.utils.ColorUtil;
	
	public class CartesianLegendItem extends LegendItem {
		public function CartesianLegendItem() {
			super();
			this.buttonMode = true;
			this.mouseChildren = false;
			this.addEventListener(MouseEvent.CLICK,selecteLegend,false,0,true);

		}
		
		private function selecteLegend(e:MouseEvent):void
		{
			if(e.target is LegendItem)
			{
				var cp:ColorPicker = new ColorPicker();
				this.addChild(cp);
				cp.selectedColor = (element as UIComponent).getStyle("fill").color;//element 负责生成此图例项目的图表元素。
				cp.addEventListener(DropdownEvent.CLOSE, changeItemColor,false,0,true);
				cp.x = e.localX;
				cp.y = e.localY;
				cp.width = 0;
				cp.height = 0;
				cp.open();
			}
		}
		
		private function changeItemColor(e:DropdownEvent):void 
		{
			var solidColor:SolidColor = (element as UIComponent).getStyle("fill") as SolidColor;				
			if (solidColor != null)
			{
				solidColor.color = e.target.selectedColor;
			}
			(element as UIComponent).setStyle("fill",solidColor);
			var stroke:SolidColorStroke = (element as UIComponent).getStyle("stroke");
			if (stroke != null)
			{
				stroke.color = e.target.selectedColor;					
			}
			(element as UIComponent).setStyle("stroke",stroke);
			e.target.removeEventListener(DropdownEvent.CLOSE, changeItemColor,false);
			this.removeChild(e.target as DisplayObject);
			(this.marker as IInvalidating).invalidateDisplayList();
			(element as UIComponent).invalidateDisplayList();
			this.invalidateDisplayList();
		}
	}
}
 PolarLegendItem:
package com.skin
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	import mx.charts.LegendItem;
	import mx.charts.chartClasses.ChartElement;
	import mx.charts.chartClasses.GraphicsUtilities;
	import mx.charts.chartClasses.StackedSeries;
	import mx.charts.renderers.BoxItemRenderer;
	import mx.charts.series.ColumnSeries;
	import mx.charts.series.LineSeries;
	import mx.charts.series.PieSeries;
	import mx.controls.ColorPicker;
	import mx.core.IDataRenderer;
	import mx.core.IFlexDisplayObject;
	import mx.core.IInvalidating;
	import mx.core.UIComponent;
	import mx.events.DropdownEvent;
	import mx.graphics.IFill;
	import mx.graphics.SolidColor;
	import mx.graphics.SolidColorStroke;
	import mx.graphics.Stroke;
	import mx.skins.ProgrammaticSkin;
	import mx.utils.ColorUtil;
	
	public class PolarLegendItem extends LegendItem {
		public function PolarLegendItem() {
			super();
			this.buttonMode = true;
			this.mouseChildren = false;
			this.addEventListener(MouseEvent.CLICK,selecteLegend,false,0,true);
		}

		private function selecteLegend(e:MouseEvent):void
		{
			if(e.target is LegendItem)
			{
				var cp:ColorPicker = new ColorPicker();
				this.addChild(cp);
				cp.selectedColor =  (marker as IDataRenderer).data.fill.color;
				/*marker 此图例项目所显示的标记。因为对于PieChart来说,chart中每一块其实是一个PieSeries生产的,所以如果你
				用element来取值的话,你会发现每次element都是同样的。
				*/
				cp.addEventListener(DropdownEvent.CLOSE, changeItemColor,false,0,true);
				cp.x = e.localX;
				cp.y = e.localY;
				cp.width = 0;
				cp.height = 0;
				cp.open();
			}
		}
		
		private function changeItemColor(e:DropdownEvent):void 
		{		
				var solidColor:SolidColor = (marker as IDataRenderer).data.fill as SolidColor;				
				if (solidColor != null)
				{
					solidColor.color = e.target.selectedColor;
				}
				e.target.removeEventListener(DropdownEvent.CLOSE, changeItemColor,false);
				this.removeChild(e.target as DisplayObject);
				(marker as IInvalidating).invalidateDisplayList();
				(element as IInvalidating).invalidateDisplayList();
				this.invalidateDisplayList();
			}
	}
}

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Flex Chart 图表3D展示

    Flex Chart的3D展示,采用Flex as语言,动态画出图标3D效果。该图表为网上淘下来,自认为很厉害的一个源码。

    flex Chart

    flex 各种图表的代码,特别是柱状图,里面写了好多不同样式的柱状图,比如圆形的,竖直显示值,重叠的,透明的等。

    flex+java制作图表以及登陆案例

    本人这段时间在学习flex 自己写的一些成功案例 包括lineChart BarChart bubbleChart pieChart等图表.这些图表都能显示从java后台传入的数据 保证可以运行 好资源所以分数有点高,望大家鼎力支持.

    flex 指南 Flex入门 Flex实例 flex图表 flex与java flex中文帮助 flex培训

    chart.rar--java+flex图表 Flex3高级图表开发指南.pdf--英文的 Flex+白皮书.pdf flex-demo.rar Flex入门培训资料及PPT.rar flex中文帮助.pdf InfoQ Flex与JSON及XML的互操作.mht 结合java做的flex图表例子 - 点点...

    flex4图表提示信息重写

    flex4 chart toolTip颜色与图形一致 重写flex chart ToolTip样式

    Chart_Explorer

    flex chart图表 codeflex chart图表 codeflex chart图表 codeflex chart图表 code

    flex chart explorer

    flex 图表 explorer

    flex fusionchart 破解

    6.在flex_src下新建一个chart包,将Fusionchart破解这个压缩包里的那两个文件拷入到chart包下 7.在FusionTest.mxml中编写代码: Xml代码 &lt;?xml version="1.0" encoding="utf-8"?&gt; xmlns:s="library://ns....

    flexchartdemo

    这个工程是用flex画图表(piechart饼状图/lineChart折线图/ColumnChart直方图),并将生产的swf文件成功嵌入到网页中,在你自己的网页中你想放的任意地方嵌入swf(flash动画)文件。 亮点: 1、三个图鼠标放在相应...

    flex用openflashchart制作图表报表

    NULL 博文链接:https://67566894.iteye.com/blog/715118

    flex各种图表的实现

    flex实现饼图、条状图、柱状图,并增加过渡效果。

    Eclipse开发Flex新手必学例子(后台数据页面显示N种图表)

    关于Flex中各种图形的例子 LineChart Columnchart Areachart Bubblechart Barchart 的例子 数据从后台的Java类获取 也可以从数据库获取

    FusionChartsFlex官方实例、图表类库及api文档

    FusionChartsFlex官方实例、图表类库及api文档。要查看官方API文档,直接运行index.html这个就行。把这个看熟了,就可以了。还有一些实例也不错。在Examples包下。在Charts包下,有各种图形的.swc包。

    flex学习资料很多

    chart.rar--java+flex图表; Flex3高级图表开发指南.pdf--英文的; 结合java做的flex图表例子 - 点点滴滴 - JavaEye技术网站.mht; Flex+白皮书.pdf; InfoQ Flex与JSON及XML的互操作.mht; flex-demo.rar; flex中文帮助....

    【实例】flex4 动态获取对象属性,动态生成数据源,动态生成lineChart,清除数据。

    flex4 动态获取对象属性,动态生成数据源,动态生成lineChart,清除数据。 1.该图表的数据源为ArrayCollection类型的arrayC 2.每增加一条线,其实就是增加一个数据源中的ArrayCollection每个对象的一个属性,且属性...

    open flash char2 操作文当

    传入的Json文件会指定图表的类型,颜色,线条类型等信息。该json文件可以是服务器上通过动态脚本生成的,也可以是本地文件。为了方便在不同环境下生成需要的json文件,作者提供了相应的开发包。在发行包目录下我们...

    open flash chart 2 swc包

    open flash chart 2 的swc文件包 可以在flex里面调用了. [Bindable] private var chart:String='{ "elements": [ { "type": "bar","alpha":0.8,"colour":"#663366", "values": [ 0 ] } ], "title": { "text": "...

    claroflex-gantt-chart-django:甘地图的Django BE

    claroflex-gantt-chart-django 甘特图的Django BE安装Web服务器mkdir venvvirtualenv --prompt= " (venv:claroflex) " ./venv/source ./venv/bin/activategit clone ...

    FusionChartsFlex 破解

    支持各种chart图表效果和显示,破解无水印

    WijmoJS 前端开发工具包 2019V1历史版本的下载包

    WijmoJS 前端开发工具包由多款灵活高效、零依赖、轻量级的纯前端控件组成,如表格控件 FlexGrid、图表控件 FlexChart、数据分析 OLAP 等,完美支持原生 JavaScript,以及 Angular、React、Vue、TypeScript、Knockout...

Global site tag (gtag.js) - Google Analytics