自定义图表刻度标签

Flex为我们提供了一套非常强大的图表组件,而且这些组件给我们开发人员提供了丰富的接口,在此基础上可以扩展出更加令人兴奋的应用。
下面是我扩展的AxisRenderer类,AxisRenderer是图表轴渲染器,所有图表的轴都是通过这个类来渲染的。而我这个例子所做就是在AxisRenderer的基础上提供几个接口(以Style方式),这几个接口的作用是给轴的刻度标签加上格式、前/后缀、千位符、单位。

Demo


AxisRendererPlus继承自mx.charts.AxisRenderer

package org.beasy.charts
{
	import mx.charts.AxisRenderer;
	import mx.charts.LinearAxis;
	import mx.charts.chartClasses.IAxisRenderer;
	import mx.formatters.NumberFormatter;
 
	/**
	 * 是否显示千位符
	 * 
	 * @default false
	 */
	[Style(name="useThousandsSeparator", type="Boolean", inherit="no")]
 
	/**
	 * 保留小数点位数
	 * 
	 * @default 0
	 */	
	[Style(name="precision", type="int", format="Length", inherit="no")]
 
	/**
	 * 前缀
	 * 
	 * @param null
	 */	
	[Style(name="prefix", type="String", inherit="no")]
 
	/**
	 * 后缀
	 * 
	 *@default null 
	 */	
	[Style(name="suffix", type="String", inherit="no")]
 
	/**
	 * 货币单位
	 * 
	 * @param value
	 */	
	[Style(name="moneyUnit", type="com.beasy.charts.MoneyUnits", inherit="no")]
 
	/**
	 * 扩展过的AxisRendererPlus
	 * 支持定义标签格式:
	 * 1,支持千们符
	 * 2,小数点保留位数
	 * 3,前缀
	 * 4,后缀
	 * 5,大数字单位缩写
	 * 
	 * @author Marco
	 */	
	public class AxisRendererPlus extends AxisRenderer
	{
		//--------------------------------------------------------------------------
		//
		//  Constructor
		//
		//--------------------------------------------------------------------------
 
		public function AxisRendererPlus()
		{
			super();
			labelFunction = myLabelFunction;
			numberFmt = new NumberFormatter();
		}
 
		//--------------------------------------------------------------------------
		//
		//  Variables
		//
		//--------------------------------------------------------------------------
 
		/**
		 * @private
		 */		
		private var numberFmt:NumberFormatter;
 
		//--------------------------------------------------------------------------
		//
		//  Methods
		//
		//--------------------------------------------------------------------------
 
		/**
		 * @private
		 * 
		 * 根据设定的样式值在labelFunction中转换显示的标签.
		 */		
		public function myLabelFunction(axisRenderer:IAxisRenderer, label:String):String
		{
			var useThousandsSeparator:Boolean = getStyle("useThousandsSeparator");
			var precision:int = getStyle("precision");
			var prefix:String = getStyle("prefix");
			var suffix:String = getStyle("suffix");
			var moneyUnit:MoneyUnits = getStyle("moneyUnit");
 
			if( axisRenderer.axis is LinearAxis )
			{
				var num:Number = Number( label );
				if( moneyUnit )
					num = MoneyUnits.formatByUnit(moneyUnit.unit, num);
 
				numberFmt.precision = precision;
				numberFmt.useThousandsSeparator = useThousandsSeparator;
				label = numberFmt.format(num);
				if( prefix )
					label = prefix+label;
				if( moneyUnit && moneyUnit.unit != MoneyUnits.NONE )
					label += moneyUnit.label;
				if( suffix )
					label += suffix;
			}
			return label;
		}
 
 
 
	}
}

单位实体类MoneyUnits.as:

package org.beasy.charts
{
 
	/**
	 * 货币单位对象
	 * 
	 * @author Marco
	 */	
	public class MoneyUnits
	{
		//--------------------------------------------------------------------------
		//
		//  Class constants
		//
		//--------------------------------------------------------------------------
 
		/**
		 * 原始单位
		 */		
		public static const NONE:String = "none";
 
		/**
		 * 百
		 */		
		public static const HUNDRED:String = "hundred";
 
		/**
		 * 千
		 */		
		public static const THOUSAND:String = "thousand";
 
		/**
		 * 万
		 */		
		public static const TEN_THOUSAND:String = "TEN_THOUSAND";
 
		/**
		 * 十万
		 */		
		public static const LAKH:String = "lakh";
 
		/**
		 * 百万
		 */		
		public static const MILLION:String = "million";
 
		//--------------------------------------------------------------------------
		//
		//  Constructor
		//
		//--------------------------------------------------------------------------
 
		public function MoneyUnits( label:String = null, unit:String = null )
		{
			super();
			_label = label;
			_unit = unit;
		}
 
		//--------------------------------------------------------------------------
		//
		//  Properties
		//
		//--------------------------------------------------------------------------
 
		/**
		 * @private
		 */		
		private var _label:String;
 
		/**
		 * @private
		 */		
		private var _unit:String;
 
		/**
		 * 单位所对应的标签:百,千,万...
		 */		
		public function set label(value:String):void
		{
			_label = value;
		}
		public function get label():String
		{
			return _label;
		}
 
		/**
		 * 要转换的单位:HUNDRED,THOUSAND,TEN_THOUSAND...
		 */		
		public function set unit(value:String):void
		{
			_unit = value;
		}
		public function get unit():String
		{
			return _unit;
		}
 
		/**
		 * @private
		 * 
		 * 根据代币单位计算
		 */		
		public static function formatByUnit( unitStr:String, num:Number ):Number
		{
			switch( unitStr )
			{
				case MoneyUnits.NONE :
					break;
 
				case MoneyUnits.HUNDRED :
					num /= 100;
					break;
 
				case MoneyUnits.THOUSAND :
					num /= 1000;
					break;
 
				case MoneyUnits.TEN_THOUSAND :
					num /= 10000;
					break;
 
				case MoneyUnits.LAKH :
					num /= 100000;
					break;
 
				case MoneyUnits.MILLION :
					num /= 1000000;
					break;
 
				default : break;
			}
			return num;
		}
 
	}
}

测试页面CustomLinearAxisLabelsFormat.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:charts="org.beasy.charts.*"
			   xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768" fontSize="12">
	<s:layout>
		<s:BasicLayout/>
	</s:layout>
	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
 
			[Bindable]
			public var dataSource:ArrayCollection = new ArrayCollection([
				{ Country: "USA", Gold: 3500, Silver:3900, Bronze: 2900 },
				{ Country: "China", Gold: 3200, Silver:1700, Bronze: 1400 },
				{ Country: "Russia", Gold: 2700, Silver:2700, Bronze: 3800 }]);
 
		]]>
	</fx:Script>
	<s:Panel title="图表轴标签自定义格式测试" width="500" height="500" left="20" top="20">
		<s:layout><s:VerticalLayout/></s:layout>
		<mx:ColumnChart id="columnChart" width="100%" height="100%" dataProvider="{dataSource}" showDataTips="true">
			<mx:verticalAxisRenderers>
				<charts:AxisRendererPlus id="axisRenderer" fontSize="12"
										 useThousandsSeparator="{thousandsSeparator.selected}"
										 precision="{precision.value}"
										 prefix="{prefix.text}"
										 suffix="{suffix.text}"
										 moneyUnit="{moneyUnits.selectedItem}">
					<charts:axis>
						<mx:LinearAxis id="vAxis"/>
					</charts:axis>
				</charts:AxisRendererPlus>
			</mx:verticalAxisRenderers>
			<mx:horizontalAxis>
				<mx:CategoryAxis categoryField="Country"/>
			</mx:horizontalAxis>
			<mx:series>
				<mx:ColumnSeries displayName="Gold" yField="Gold" verticalAxis="{vAxis}"/>
				<mx:ColumnSeries displayName="Silver" yField="Silver" verticalAxis="{vAxis}"/>
				<mx:ColumnSeries displayName="Bronze" yField="Bronze" verticalAxis="{vAxis}"/>
			</mx:series>
		</mx:ColumnChart>
		<mx:Form>
			<mx:FormItem label="千位符:">
				<s:CheckBox id="thousandsSeparator" selected="true"/>
			</mx:FormItem>
			<mx:FormItem label="小数点位数:">
				<s:NumericStepper id="precision" minimum="0" maximum="2" stepSize="1" value="1"/>
			</mx:FormItem>
			<mx:FormItem label="前缀:">
				<s:TextInput id="prefix" text="$"/>
			</mx:FormItem>
			<mx:FormItem label="后缀:">
				<s:TextInput id="suffix"/>
			</mx:FormItem>
			<mx:FormItem label="单位:">
				<mx:ComboBox id="moneyUnits">
					<fx:Array>
						<charts:MoneyUnits label="无" unit="{MoneyUnits.NONE}"/>
						<charts:MoneyUnits label="百" unit="{MoneyUnits.HUNDRED}"/>
						<charts:MoneyUnits label="千" unit="{MoneyUnits.THOUSAND}"/>
						<charts:MoneyUnits label="万" unit="{MoneyUnits.TEN_THOUSAND}"/>
						<charts:MoneyUnits label="十万" unit="{MoneyUnits.LAKH}"/>
					</fx:Array>
				</mx:ComboBox>
			</mx:FormItem>
		</mx:Form>
	</s:Panel>
</s:Application>

Ps: 全部代码请查看: http://code.google.com/p/beasy-flex-library/ 这里包含了本博所有文章源码.
SVN: http://beasy-flex-library.googlecode.com/svn/trunk/

相关日志

  1. 得失 说道:

    Demo看不到哇

  2. AmyHa35 说道:

    Buy an essay or already written essay and be sure you get good information just about this good post*.

  1. 纬度网 说道:

    自定义图表刻度标签…

    Flex为我们提供了一套非常强大的图表组件,而且这些组件给我们开发人员提供了丰富的接口,在此基础上可以扩展出更加令人兴奋的应用。 下面是我扩展的AxisRenderer类,AxisRenderer是图表轴渲染器,所有图表的轴都是通过这个类来渲染的。而我这个例子所做就是在AxisRenderer的基础上提供几个接口(以Style方式),这几个接口的作用是给轴的刻度标签加上格式、前/后缀、千位符、单位。 Demo AxisRendererPlus继承自mx.charts.AxisRenderer pac…

添加评论