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

利用AxisRenderer格式化图表刻度标签

    博客分类:
  • flex
阅读更多
原创文章,转载请注明出处:http://montage.iteye.com/blog/508749
用Flex做企业应用时经常要用到Flex的图表组件;Flex的图表组件非常强大,但是Flex Chart没有对图表刻度轴格式化的功能;如果10000000(一千万),这种天文数字看上去一点也不直观;
我所做的“格式化图表刻度标签”功能正是弥补了Flex Chart这一不足之处;
目前的版本支持前缀,后缀,千位符,小数保留位数,缩写;
我继承了Flex Chart的AxisRenderer命名为AxisRendererPlus,AxisRenderer是Flex Chart默认的轴渲染器。AxisRendererPlus提供了5个接口,在属性发生改变的时候通过调用invalidateProperties()使属性失效来重新触发labelFunction,在defaultLabelFunction里面做所有对标签转换的处理过程;
AxisRendererPlus.as
package com.montage.charts
{
	import mx.charts.AxisRenderer;
	import mx.charts.LinearAxis;
	import mx.charts.chartClasses.IAxisRenderer;
	import mx.formatters.NumberFormatter;
	
	/**
	 * 增加的AxisRenderer支持数据格式化,前缀,后缀,千位符,小数位数;
	 * @author Montage
	 */	
	public class AxisRendererPlus extends AxisRenderer
	{
		
		private var numberFmt:NumberFormatter;
		
		/**
		 * 是否使用千位符
		 */		
		private var _useThousandsSeparator:Boolean;
		
		/**
		 * 保留小数位数
		 */		
		private var _precision:int = 0;
		
		/**
		 * 前缀
		 */		
		private var _prefix:String;
		
		/**
		 * 后缀
		 */		
		private var _suffix:String;
		
		/**
		 * 格式化单位
		 * 比如:"10000"可以转化为"10千";
		 */		
		private var _formatUnit:FormatUnit
		
		public function AxisRendererPlus()
		{
			super();
			numberFmt = new NumberFormatter();
			labelFunction = defaultLabelFun;
		}
		
		
		public function set useThousandsSeparator( value:Boolean ):void
		{
			_useThousandsSeparator = value;
			invalidateProperties();
		}
		public function get useThousandsSeparator():Boolean
		{
			return _useThousandsSeparator;
		}
		
		public function set precision( value:int ):void
		{
			_precision = value;
			invalidateProperties();
		}
		public function get precision():int
		{
			return _precision;
		}
		
		public function set prefix( value:String ):void
		{
			_prefix = value;
			invalidateProperties();
		}
		public function get prefix():String
		{
			return _prefix;
		}
		
		public function set suffix( value:String ):void
		{
			_suffix = value;
			invalidateProperties();
		}
		public function get suffix():String
		{
			return _suffix;
		}
		
		public function set formatUnit( value:FormatUnit ):void
		{
			_formatUnit = value;
			invalidateProperties();
		}
		public function get formatUnit():FormatUnit
		{
			return _formatUnit;
		}
		
		protected function defaultLabelFun(axisRenderer:IAxisRenderer, label:String):String
		{
			if( axisRenderer.axis is LinearAxis )
			{
				var num:Number = Number( label );
				if( formatUnit )
					num = FormatUnit.formatByUnit(formatUnit.unit, num);
				
				numberFmt.precision = precision;
				numberFmt.useThousandsSeparator = useThousandsSeparator;
				label = numberFmt.format(num);
				if( prefix )
					label = prefix+label;
				if( formatUnit && formatUnit.unit != FormatUnit.NONE )
					label += formatUnit.label;
				if( suffix )
					label += suffix;
			}
			return label;
		}
		
	}
}

FormatUnit是控件缩写功能的枚举类,比如[100000]缩写为[10]万只需要实例化一个FormatUnit对象, 所以将其实label设置为"万", unit设置为FormatUnit.TEN_THOUSAND;然后再把这个实例赋值给AxisRendererPlus.formatUnit属性就可以了;
FormatUnit.as
package com.montage.charts
{
	
	/**
	 * 标签格式化单位
	 * @author Montage
	 */	
	public class FormatUnit
	{
		public static const NONE:String = "none";
		public static const HUNDRED:String = "hundred";
		public static const THOUSAND:String = "thousand";
		public static const TEN_THOUSAND:String = "tenThousand";
		public static const LAKH:String = "lakh";
		public static const MILLION:String = "million";
		
		public function FormatUnit( label:String = null, unit:String = null )
		{
			_label = label;
			_unit = unit;
		}
		
		private var _label:String;
		private var _unit:String;
		
		public function set label( value:String ):void
		{
			_label = value;
		}
		public function get label():String
		{
			return _label;
		}
		
		public function set unit( value:String ):void
		{
			_unit = value;
		}
		public function get unit():String
		{
			return _unit;
		}
		
		public static function formatByUnit( unitStr:String, num:Number ):Number
		{
			switch( unitStr )
			{
				case NONE :
					break;
				
				case HUNDRED :
					num /= 100;
					break;
				
				case THOUSAND :
					num /= 1000;
					break;
				
				case TEN_THOUSAND :
					num /= 10000;
					break;
				
				case LAKH :
					num /= 100000;
					break;
				
				case MILLION :
					num /= 1000000;
					break;
				
				default : break;
			}
			return num;
		}
		
	}
}


测试页面AxisRendererDemo.mxml,我用ColumnChart来测试,由于格式化只能处理标签为数字的刻度轴,所以我在verticalAxisRenderers里面加入了一个AxisRendererPlus;
<?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:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768" fontSize="12" 
			   xmlns:charts="com.montage.charts.*">
	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			
			[Bindable]
			private var medalsAC:ArrayCollection = new ArrayCollection( [
				{ Country: "USA", Gold: 35000, Silver:39000, Bronze: 29000 },
				{ Country: "China", Gold: 32000, Silver:17000, Bronze: 14000 },
				{ Country: "Russia", Gold: 27000, Silver:27000, Bronze: 38000 } ]);
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<s:Panel id="panel1" title="AxisRendererPlus Test" width="600" height="500">
		<s:layout><s:VerticalLayout/></s:layout>
		<mx:ColumnChart id="columnChart1" dataProvider="{medalsAC}" showDataTips="true"
				width="100%" height="100%">
			<mx:series>
				<mx:ColumnSeries verticalAxis="{linearAxis}" displayName="Gold" yField="Gold" xField="Country"/>
				<mx:ColumnSeries verticalAxis="{linearAxis}" displayName="Silver" yField="Silver" xField="Country"/>
				<mx:ColumnSeries verticalAxis="{linearAxis}" displayName="Bronze" yField="Bronze" xField="Country"/>
			</mx:series>
			<mx:horizontalAxis>
				<mx:CategoryAxis categoryField="Country"/>
			</mx:horizontalAxis>
			<mx:verticalAxisRenderers>
				<charts:AxisRendererPlus useThousandsSeparator="true" prefix="重量" suffix="㎏" precision="2">
					<charts:formatUnit>
						<charts:FormatUnit label="千" unit="{FormatUnit.THOUSAND}"/>
					</charts:formatUnit>
					<charts:axis>
						<mx:LinearAxis id="linearAxis"/>
					</charts:axis>
				</charts:AxisRendererPlus>
			</mx:verticalAxisRenderers>
		</mx:ColumnChart>
		<mx:Legend id="legend1" dataProvider="{columnChart1}" direction="horizontal"/>
	</s:Panel>
</s:Application>
  • 大小: 56.6 KB
1
1
分享到:
评论

相关推荐

    GANTT 甘特图 flex actionscript as 源码

    这可以通过定义AxisRenderer类并定制刻度标签来实现。 6. 任务依赖关系:在甘特图中,可以使用线段或箭头表示任务间的依赖关系。这需要额外的绘图逻辑来实现。 7. 动态交互:为了增强用户体验,我们可以添加拖放...

    flex 仪表盘 gauge

    - **配置刻度和标签**:通过设置`&lt;mx:LinearAxis&gt;`和`&lt;mx:AxisRenderer&gt;`标签,定义刻度线和标签的位置和格式。 - **设定指针样式**:使用`&lt;mx:Pointer&gt;`组件定制指针的外观,如颜色、形状等。 - **数据绑定**:...

    flex的labelRotation解决方法

    这个属性存在于`AxisRenderer`类中,它允许我们将图表轴上的标签以一定的角度旋转,从而节省空间或使标签更易于阅读。 `labelRotation`属性接受一个数值,该数值表示标签旋转的角度,通常以度数为单位。例如,将`...

    Flex UI组件使用全集

    - **RichTextEditor**: 富文本编辑器,支持格式化文本编辑。 - **Text**: 显示动态文本的组件。 - **TextArea**: 多行文本输入框组件。 - **TextInput**: 单行文本输入框组件。 #### Containers(容器组件) - **...

    flex动态生成datagrid表头

    4. **配置X轴和Y轴**:定义AxisRenderer来控制刻度、标签等。 ```actionscript myChart.horizontalAxis = new CategoryAxis(); myChart.horizontalAxis.dataProvider = yourCategoryData; myChart.verticalAxis ...

    Flex 3 组件实例与应用(2009版)

    - **SwitchSymbolFormatter** - 开关符号格式化器。 - **ZipCodeFormatter** - 邮政编码格式化器。 #### 六、效果、视图状态与过渡动画 ##### 1. **Effects** - **AddItemActionEffect** - 添加项目的动画效果。 ...

    Flex动态创建多个曲线图和柱形图源码

    通过HTTPService获取数据,并利用ActionScript动态创建柱形图系列,最终通过MXML配置图表的样式和布局。这种方法不仅灵活,还能根据实际情况轻松扩展,非常适合需要动态展示大量图表的应用场景。

    Flex常见效果

    除了基础的动画效果外,Flex还提供了丰富的图表绘制功能,帮助开发者快速构建数据可视化应用。 ##### 1. AreaChart `&lt;mx:AreaChart&gt;`区域图,用于展示随时间变化的趋势数据,适用于表现趋势分析。 ##### 2. ...

    How to use Flex to achieve Thematic Layers of Columnar

    例如,在ColumnChartFactory类中,我们可以设置私有变量`_width`和`_height`来控制图表的尺寸,并提供相应的setter方法。 2. **使用ClassFactory创建柱状图实例**:ClassFactory是一个工厂类,可以用来动态创建对象...

Global site tag (gtag.js) - Google Analytics