`
lipbb
  • 浏览: 68492 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex4 用LineChart实现实时曲线图,并在其中添加自定义的虚线水平线

阅读更多
本示例首先是为了显示实时曲线。然后呢,要显示个水平线,比如我要显示一个变量的变化过程,但它有一个标准值,就可以用该种方式。

示例:



然后是代码:
先看Application:
<?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/mx" xmlns:chartClasses="lip.charts.chartClasses.*">
	
	<fx:Script>
		<![CDATA[
			import lip.utils.DateFormatter;
			
			import mx.collections.ArrayCollection;
			import mx.utils.ObjectProxy;
			
			private static const DELAY:int = 1000;
			
			private static const MAX_COUNT:int = 10;
			
			[Bindable]
			private var ac:ArrayCollection;
			
			private var timer:Timer;
			
			protected function startCalc(event:MouseEvent):void
			{
				if(!timer)
				{
					timer = new Timer(DELAY);
					timer.addEventListener(TimerEvent.TIMER, timer_timerHandler);
				}
				timer.start();
			}
			
			protected function stopCalc(event:MouseEvent):void
			{
				if(timer)
					timer.stop();
				
				ac = null;
			}
			
			protected function timer_timerHandler(event:TimerEvent):void
			{
				var now:Date = new Date();
				var nowTime:String;
				
				if(!ac)
				{
					ac = new ArrayCollection();
					now.setTime(now.time - 1000 * MAX_COUNT);
					for (var i:int = 0; i < MAX_COUNT; i++) 
					{
						nowTime = DateFormatter.getInstance().formatTime(now);
						ac.addItem(new ObjectProxy({time:nowTime, gas:0}));
						now.setTime(now.time + 1000);
					}
					
				}
				
				nowTime = DateFormatter.getInstance().formatTime(now);
				var item:ObjectProxy = new ObjectProxy({time:nowTime, gas:Math.round(Math.random() * 100) * .01});
				
				if(ac.length < 10)
				{
					ac.addItem(item);
				}
				else
				{
					ac.removeItemAt(0);
					ac.addItem(item);
				}
				
				trace(item.time, ":", item.gas);
			}
			
			protected function changeDashedLine(event:MouseEvent):void
			{
				nn = Math.round((Math.random() / 5 + 0.8) * 100) * .01;
			}
			
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
		<mx:SeriesInterpolate id="effect" duration="1000" />
		<fx:Number id="nn">0.3</fx:Number>
	</fx:Declarations>
	
	<s:Panel width="600" height="500" title="测试实时曲线">
		<s:controlBarContent>
			<s:HGroup width="100%" height="20" horizontalAlign="center" verticalAlign="middle">
				<s:Button label="start" click="startCalc(event)"/>
				<s:Button label="stop" click="stopCalc(event)"/>
				<s:Button label="change dashed line" click="changeDashedLine(event)"/>
			</s:HGroup>
		</s:controlBarContent>
		<mx:LineChart id="chart" width="500" height="400" horizontalCenter="0" showDataTips="true"
					  verticalCenter="0" dataProvider="{ac}" >
			<mx:backgroundElements>
				<mx:GridLines gridDirection="both"/>
				<chartClasses:DashedLines lineColor="0xFF0000" yValue="{nn}"/>
			</mx:backgroundElements>
			
			<mx:horizontalAxis>
				<mx:CategoryAxis categoryField="time" displayName="Time" title="时间" />
			</mx:horizontalAxis>
			
			<mx:verticalAxis>
				<mx:LinearAxis minimum="0" maximum="1"/>
			</mx:verticalAxis>
			
			<mx:series>
				<mx:LineSeries displayName="瓦斯" xField="time" yField="gas" form="curve"/>
			</mx:series>
		</mx:LineChart>
		
	</s:Panel>
</s:Application>


接下来是里面的DashedLines:
package lip.charts.chartClasses
{
	import flash.display.Graphics;
	import flash.geom.Point;
	
	import lip.utils.GraphicUtils;
	
	import mx.charts.chartClasses.CartesianChart;
	import mx.charts.chartClasses.CartesianTransform;
	import mx.charts.chartClasses.ChartElement;
	import mx.charts.chartClasses.ChartState;
	import mx.charts.chartClasses.IAxis;
	
	public class DashedLines extends ChartElement
	{
		public function DashedLines()
		{
			super();
		}

		private var _yValue:Number = NaN;

		/**
		 * 该线对应的y值
		 */
		public function get yValue():Number
		{
			return _yValue;
		}

		/**
		 * @private
		 */
		public function set yValue(value:Number):void
		{
			_yValue = value;
			invalidateDisplayList();
		}


		/**
		 * 实线部分的长度
		 * @default 10
		 */
		public var length:Number = 10;

		/**
		 * 空白部分的长度
		 * @default 5
		 */
		public var gap:Number = 5;

		/**
		 * 线条的宽度
		 * @default 1
		 */
		public var lineThickness:Number = 1;

		/**
		 * 线条的颜色
		 * @default 黑色
		 */
		public var lineColor:uint = 0;
		
		private var _displayName:String;

		/**
		 * 该线所对应的数值名称(平均值,最大值等等)
		 * @default 
		 */
		public function get displayName():String
		{
			return _displayName;
		}

		/**
		 * @private
		 */
		public function set displayName(value:String):void
		{
			_displayName = value;
			invalidateDisplayList();
		}

		
		protected var label:TextField;
		
		override protected function createChildren():void
		{
			// TODO Auto Generated method stub
			super.createChildren();
			
			if(!label)
			{
				label = new TextField();
				label.mouseEnabled = false;
				addChild(label);
			}
		}


		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			super.updateDisplayList(unscaledWidth, unscaledHeight);

			if (!chart||
				chart.chartState == ChartState.PREPARING_TO_HIDE_DATA ||
				chart.chartState == ChartState.HIDING_DATA)
			{
				return;
			}
			
			var g:Graphics = this.graphics;
			g.clear();
			
			// 如果没有设置数据,不显示
			if(isNaN(yValue))
			{
				return;
			}
			
			var w:Number = unscaledWidth;
			var h:Number = unscaledHeight;
			var vAxis:IAxis = CartesianChart(this.chart).verticalAxis;
			
			var y:Number = dataToLocal(0, yValue).y;
			
			var pFrom:Point = new Point(0, y);
			var pTo:Point = new Point(w, y);
			
			GraphicUtils.drawDashed(g, pFrom, pTo, this.length, this.gap, this.lineThickness, this.lineColor);
			
			label.text = (displayName ? (displayName + " : ") : "") + yValue;
			label.x = 1;
			label.y = y > 21 ? y - 21 : y + 1;
		}


		// 这个方法复制自LineSeries
		override public function dataToLocal(... dataValues):Point
		{
			var data:Object = {};
			var da:Array /* of Object */ = [ data ];
			var n:int = dataValues.length;
			
			if (n > 0)
			{
				data["d0"] = dataValues[0];
				dataTransform.getAxis(CartesianTransform.HORIZONTAL_AXIS).
					mapCache(da, "d0", "v0");
			}
			
			if (n > 1)
			{
				data["d1"] = dataValues[1];
				dataTransform.getAxis(CartesianTransform.VERTICAL_AXIS).
					mapCache(da, "d1", "v1");           
			}
			
			dataTransform.transformCache(da,"v0","s0","v1","s1");
			
			return new Point(data.s0 + this.x,
				data.s1 + this.y);
		}
	}
}


还有其中用到的GraphicUtils.drawDashed()方法:

package lip.utils
{
	import flash.display.Graphics;
	import flash.geom.Point;

	/**
	 * 一些绘图相关的方法
	 * @author lip
	 */
	public class GraphicUtils
	{
		public function GraphicUtils()
		{
		}
		
		
		/**
		 * 画虚线
		 * @param graphics 你懂的
		 * @param pFrom 起点
		 * @param pTo 终点
		 * @param length 实线段的长度
		 * @param gap 实线段的间距
		 * @param thickness 线的宽度
		 * @param color 线的颜色
		 */
		public static function drawDashed(graphics:Graphics, pFrom:Point, pTo:Point, length:Number = 5, gap:Number = 5, thickness:Number = 1, color:uint = 0):void
		{
			var max:Number = Point.distance(pFrom, pTo);
			var l:Number = 0;
			var p3:Point;
			var p4:Point;
			graphics.lineStyle(thickness, color);
			while (l < max)
			{
				p3 = Point.interpolate(pTo, pFrom, l / max);
				l += length;
				if (l > max)
					l = max;
				p4 = Point.interpolate(pTo, pFrom, l / max);
				graphics.moveTo(p3.x, p3.y)
				graphics.lineTo(p4.x, p4.y)
				l += gap;
			}
		}
	}
}


代码不太多,就不详细解释了。
1
1
分享到:
评论
14 楼 truelove12358 2016-03-01  
   坑爹啊楼主,文件名与包名、类名不一致,导致一直报坑爹的1024错误,不能解析为组件,坑坑坑,找了我2天
13 楼 天马行空洞 2014-12-02  
这个实例很好使用。我也提个建议,我用的时候DashedLines.as里面的这一句定义不能被引用:protected var label:TextField;改为private var label:TextField;就可以了。
12 楼 516456267 2012-10-18  
lipbb 写道
516456267 写道
import lip.utils.DateFormatter
这个代码呢?

它就是把Date转为一个字符串,这个自己写一下吧。实际上就是包装一下flex自带的DateFormatter或者DateTimeFormatter

谢了。
11 楼 chensong215 2012-08-31  
lipbb 写道
chensong215 写道
对于双坐标画水平线,可参考http://hi.baidu.com/chensong_blog/item/77070e392b11db617d034bdd

有图有代码


:D 不错
不过建议你还是换个博客吧,百度的不支持贴代码格式,看起来好费劲



是,而且不能上传附件,很麻烦
10 楼 lipbb 2012-08-30  
chensong215 写道
对于双坐标画水平线,可参考http://hi.baidu.com/chensong_blog/item/77070e392b11db617d034bdd

有图有代码


:D 不错
不过建议你还是换个博客吧,百度的不支持贴代码格式,看起来好费劲
9 楼 chensong215 2012-08-29  
对于双坐标画水平线,可参考http://hi.baidu.com/chensong_blog/item/77070e392b11db617d034bdd

有图有代码
8 楼 chensong215 2012-08-29  
JavaScape 写道
找了很久 画横线的方法 ;
有很多解决方案,
但是个人感觉这个方法最合理!
楼主英明 谢谢了! 



对于双坐标图表,这种画法是不对的
7 楼 JavaScape 2012-05-19  
找了很久 画横线的方法 ;
有很多解决方案,
但是个人感觉这个方法最合理!
楼主英明 谢谢了! 
6 楼 lipbb 2012-05-18  
516456267 写道
import lip.utils.DateFormatter
这个代码呢?

它就是把Date转为一个字符串,这个自己写一下吧。实际上就是包装一下flex自带的DateFormatter或者DateTimeFormatter
5 楼 516456267 2012-05-17  
import lip.utils.DateFormatter
这个代码呢?
4 楼 zy14shadow 2012-04-18  
    有用的事例!!!
3 楼 live711 2012-02-07  
2 楼 lipbb 2011-12-20  
1 楼 A80082828 2011-12-15  
DateFormatter  这个怎么写啊    项目要用到一个这样的功能,以前没有接触过flex

相关推荐

    flex实时更新曲线图

    在实时更新曲线图的场景中,ActionScript主要负责处理数据的获取、解析以及与图表组件的交互,如设置数据提供者、监听数据变化等。 4. **MXML**:MXML是一种声明式语言,用来描述Flex应用的用户界面布局和组件结构...

    flex 改变linechart datatips 显示样式代码

    总结来说,改变Flex LineChart Datatips的显示样式主要包括两步:一是定义自定义的CSS样式类,并在Chart组件中引用;二是根据需求编写`dataTipFunction`函数,自定义Datatips的内容。通过这样的方式,我们可以使Line...

    flex添加动态曲线(lineChart)

    动态添加曲线条数 通过传递lablefild,和dataProvider的数组实现动态添加曲线

    Flex 实时曲线图(定时获取后台数据)

    通过上述分析,我们了解到这个Flex实时曲线图的核心实现是利用`setInterval`定时器不断向`ArrayCollection`数据集合中添加新生成的数据,并通过`mx:LineChart`组件将这些数据可视化展示出来。这种方式简单而有效,...

    Flex 饼状、柱状、实时曲线图

    本篇将深入探讨Flex中的饼状图、柱状图以及实时曲线图的实现方法和相关知识点。 一、Flex饼状图 饼状图是一种用于表示部分与整体之间关系的图形。在Flex中,我们可以使用mx.charts.PieChart类来创建饼状图。每个...

    Flex 饼形图 piechart 柱形图 columnchart 条形图 barchart 折线图 linechart

    在Flex中,饼形图(piechart)、柱形图(columnchart)、条形图(barchart)和折线图(linechart)是数据可视化的重要工具,它们广泛应用于数据分析、报表展示以及业务指标的可视化。 **饼形图(Pie Chart)** 饼形...

    flex LineChart实例

    此Flex LineChart实例不仅展示了如何在Flex中绘制基本的线形图,还涉及到了一些高级功能,如自定义标签格式、数据绑定以及动态加载数据等。对于想要使用Flex框架进行数据可视化的开发者来说,这是一个非常实用的参考...

    flex多曲线图,实时更新

    本文将详细探讨如何使用Flex创建多曲线图,并实现实时更新功能。 一、Flex概述 Flex是Adobe开发的一个强大的开发工具,允许开发者创建具有交互性和丰富用户体验的Web应用程序。它提供了一个MXML和ActionScript的...

    flex LineChart

    以下是我最近做flex组件编程时的总结,是主要针对lineChart的用法,其中某些属性对同是有横纵坐标的columnChart、barChart等都有效,比如对背景的网格线、横纵坐标线条的粗细颜色和标签的设置都有效。

    Flex chart line 线性表(单线和双线)

    此外,Flex Chart还支持各种其他类型的图表,如柱状图、饼图、面积图等,以及丰富的自定义选项,如添加图例、轴标签、数据提示等,以满足不同需求。 在压缩包文件"flex chart"中,可能包含了示例代码、FLA文件...

    Flex 拖动,滚动曲线图

    总的来说,"Flex 拖动,滚动曲线图 LineChart"涉及的知识点包括:Flex编程、ActionScript 3.0、mx.charts库中的LineChart组件、mx.controls.Scroller组件的使用,以及鼠标事件处理和图形渲染的原理。掌握这些知识点...

    flex as3虚线

    我们可以创建一个自定义的AS3类,比如`MyDashLine.as`,并在其中覆盖`drawLine()`方法来绘制虚线。以下是一个基本的实现步骤: 1. 创建一个新的AS3类继承自Sprite或Shape,例如`MyDashLine`: ```as3 package { ...

    Flex LineChart

    Flex Chart Sytles 简单示例 基本样式使用,网上搜到的收藏下。

    flex4自定义事件用法

    在运行过程中,你将能够看到自定义事件的实现和使用情况。 在Flex4中,自定义事件为应用程序提供了更强大的交互和通信能力。通过理解自定义事件的创建、派发和监听,开发者可以构建出更加灵活和可扩展的应用程序。...

    Flex画 坐标轴曲线 项目用过的 flex4 开发

    在Flex4开发中,创建坐标轴曲线图是一种常见的需求,特别是在数据可视化和图表展示的应用中。Flex是一个基于ActionScript和MXML的开放源代码框架,主要用于构建富互联网应用程序(RIA)。它提供了强大的图形和组件库...

    flex 当天24小时曲线统计

    在Flex中,我们可以使用类库如Adobe's Cairngorm或Mate来组织应用程序的架构,而图表通常由`mx:LineChart`或`spark:LineSeries`组件来实现。`RealChart`可能是一个自定义的图表组件或者是一个第三方图表库,用于生成...

    flex画虚线代码

    在探讨“flex画虚线代码”这一主题时,我们深入解析如何利用Flex框架中的图形功能来绘制虚线,以及理解这段代码背后的核心逻辑和技术要点。Flex是一个强大的开发框架,主要用于构建跨平台的富互联网应用程序(RIA)...

    flex_linechart

    flex项目开发过程中的动态linechart,主要是曲线可以增量的刷新,纵坐标、刷新频率可以调整,也可以稍微改下根据配置进行曲线设置,这个是少了获取数据的方法用随机数代替,项目中用到动态linechart的可以参考。

    Flex BlazeDs 推数据生成lineChart实例

    Flex BlazeDs推数据生成lineChart实例是一个典型的前端与后端实时通信的应用场景,它结合了Adobe Flex技术用于前端用户界面的构建,BlazeDS作为数据推送服务,以及使用lineChart组件来展示动态更新的数据。...

Global site tag (gtag.js) - Google Analytics