本示例首先是為了顯示實時曲線。然后呢,要顯示個水平線,比如我要顯示一個變量的變化過程,但它有一個標準值,就可以用該種方式。 示例: 然后是代碼: 先看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;
-
-
-
-
- public function get yValue():Number
- {
- return _yValue;
- }
-
-
-
-
- public function set yValue(value:Number):void
- {
- _yValue = value;
- invalidateDisplayList();
- }
-
-
-
-
-
-
- public var length:Number = 10;
-
-
-
-
-
- public var gap:Number = 5;
-
-
-
-
-
- public var lineThickness:Number = 1;
-
-
-
-
-
- public var lineColor:uint = 0;
-
- private var _displayName:String;
-
-
-
-
-
- public function get displayName():String
- {
- return _displayName;
- }
-
-
-
-
- public function set displayName(value:String):void
- {
- _displayName = value;
- invalidateDisplayList();
- }
-
-
- protected var label:TextField;
-
- override protected function createChildren():void
- {
-
- 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;
- }
-
-
-
- override public function dataToLocal(... dataValues):Point
- {
- var data:Object = {};
- var da:Array = [ 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;
-
-
-
-
-
- public class GraphicUtils
- {
- public function GraphicUtils()
- {
- }
-
-
-
-
-
-
-
-
-
-
-
-
- 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;
- }
- }
- }
- }
|