近来在做报表的东西,看了网上的开源的东西,感觉好长的代码好复杂的逻辑,所以干脆自己写了一个。欢迎大家来找碴。
package xoyo.chart
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import xoyo.compment.ToolTips;
public class waveChart extends Sprite
{
private var coordinate:Shape;
public var xlengh:Number;
public var ylengh:Number;
public var pitch:Number;
private var circleshape:Sprite;
private var container:Sprite;
private var _data:Array;
private var _tool:ToolTips;
public function waveChart(xl:Number,yl:Number,_pitch:Number,data:Array)
{
_data=data;
xlengh=xl;
ylengh=yl;
pitch=_pitch;
coordinate=new Shape();
this.addChild(coordinate);
container=new Sprite;
container.x=2;
container.y=-2;
this.addChild(container);
drawline();
container.addChild(drawgrid());
circleshape=drawcicle();
circleshape.addEventListener(MouseEvent.MOUSE_OVER,onOver);
circleshape.addEventListener(MouseEvent.MOUSE_OUT,onOut);
container.addChild(circleshape);
_tool=new ToolTips();
_tool.visible=false;
container.addChild(_tool);
}
private function onOut(e:Event):void
{
_tool.visible=false;
}
private function onOver(e:Event):void
{
if(getareaNum()!=-1)
{
_tool.x=_data[getareaNum()].x;
_tool.y=-_data[getareaNum()].y;
_tool.setContent(_data[getareaNum()].url);
_tool.visible=true;
}
}
private function getareaNum():int
{
var _len:int=_data.length;
var mousePoint:Point=new Point(this.mouseX,this.mouseY);
while(_len--)
{
if(isInrect(mousePoint,new Point(_data[_len].x,-_data[_len].y)))
{
return _len;
}
}
return _len;
}
private function isInrect(testPoint:Point,checkPoint:Point):Boolean
{
if(testPoint.x>checkPoint.x+8||testPoint.x<checkPoint.x-8||testPoint.y<checkPoint.y-8||testPoint.y>checkPoint.y+8)
{
return false;
}
return true;
}
private function drawcicle():Sprite
{
var c:Sprite=new Sprite();
with(c.graphics)
{
beginFill(0xFF0000);
//根据值去算坐标算法
for (var i:int=0;i<_data.length;i++)
{
drawCircle(_data[i].x,-_data[i].y,5);
drawCircle(_data[i].x,-_data[i].y,4);
if(i+1<_data.length)
{
lineStyle(2,0xFF0000);
if(_data[i+1].y>_data[i].y)
{
moveTo(_data[i].x+3,-_data[i].y-3);
lineTo(_data[i+1].x-3,-_data[i+1].y+3);
}else
{
moveTo(_data[i].x+3,-_data[i].y);
lineTo(_data[i+1].x-3,-_data[i+1].y-3);
}
}
}
endFill();
}
return c;
}
private function drawgrid():Shape
{
var s:Shape=new Shape();
with(s.graphics)
{
lineStyle(2,0xF6ECC1);
for (var i:int=0;i<=Math.floor(xlengh/pitch);i++)
{
moveTo(i*pitch,0);
lineTo(i*pitch,-ylengh);
}
for (var j:int=0;j<=Math.floor(ylengh/pitch);j++)
{
moveTo(0,-j*pitch);
lineTo(xlengh,-j*pitch);
}
}
return s;
}
private function drawline():void
{
with(coordinate.graphics)
{
lineStyle(2,0x784016);
lineTo(xlengh,0);
moveTo(0,0);
lineTo(0,-ylengh);
for (var i:int=0;i<=Math.floor(xlengh/pitch);i++)
{
moveTo(i*pitch,0);
lineTo(i*pitch,3);
}
for (var j:int=0;j<=Math.floor(ylengh/pitch);j++)
{
moveTo(0,-j*pitch);
lineTo(-3,-j*pitch);
}
endFill();
}
}
}
}