- package controls
- {
- import com.adobe.flex.extras.controls.springgraph.Graph;
- import com.adobe.flex.extras.controls.springgraph.IEdgeRenderer;
- import com.adobe.flex.extras.controls.springgraph.Item;
- import flash.display.BitmapData;
- import flash.display.Graphics;
- import flash.geom.Matrix;
- import flash.text.TextFieldAutoSize;
- import mx.core.IDataRenderer;
- import mx.core.UIComponent;
- import mx.core.UITextField;
- import mx.graphics.ImageSnapshot;
- public class CusEdge implements IEdgeRenderer
- {
- private var thickness:int=2;
- private var lineColor:uint=0x232323;
- private var arrowSize:int=5;
- public function CusEdge()
- {
- }
- /** 实现画线接口 **/
- public function draw(g:Graphics, fromView:UIComponent, toView:UIComponent, fX:int, fY:int, tX:int, tY:int, graph:Graph):Boolean
- {
- var fromItem: Item = (fromView as IDataRenderer).data as Item;
- var toItem: Item = (toView as IDataRenderer).data as Item;
- var node:Object=graph.getLinkData(fromItem,toItem);
- if (node.@fromID!=(fromView as CusNode).id && node.@fromID==(toView as CusNode).id)
- {
- return drawNew(g,toView,fromView,tX,tY,fX,fY,graph);
- }
- else
- {
- return drawNew(g,fromView,toView,fX,fY,tX,tY,graph);
- }
- return true;
- }
- /** 画线函数 **/
- public function drawNew(g:Graphics, fromView:UIComponent, toView:UIComponent, fX:int, fY:int, tX:int, tY:int, graph:Graph):Boolean
- {
- var fromX:int;
- var fromY:int;
- var toX:int;
- var toY:int;
- var totoX:int;
- var totoY:int;
- var eid:String;
- var halfFromH:Number=fromView.height/2;
- var halfFromW:Number=fromView.width/2;
- var halfToH:Number=toView.height/2;
- var halfToW:Number=toView.width/2;
- var angle:Number = getAngle( fX, fY, tX, tY);
- var toAngle:Number=Math.atan2(halfToH,halfToW)*(180/Math.PI);
- var fromAngle:Number=Math.atan2(halfFromH,halfFromW)*(180/Math.PI);
- var k:Number=Math.tan(angle*(Math.PI/180));
- ///to坐标换算
- if (angle>=0 && angle<90)//1象限
- {
- if (angle>toAngle)
- {
- toX=tX - halfToH / k;
- toY=tY + halfToH;
- }
- else
- {
- toX=tX - halfToW;
- toY=tY + halfToW * k;
- }
- }
- if (angle>=90 && angle<=180)//2象限
- {
- if (angle+toAngle>180)
- {
- toX=tX + halfToW ;
- toY=tY - halfToW * k;
- }
- else
- {
- toX=tX - halfToH / k;
- toY=tY + halfToH;
- }
- }
- if (angle>=-90 && angle<0)//4象限
- {
- if (Math.abs(angle)>toAngle)
- {
- toX=tX + halfToH / k;
- toY=tY - halfToH;
- }
- else
- {
- toX=tX - halfToW;
- toY=tY + halfToW * k;
- }
- }
- if (angle<-90 && angle>=-180)//3象限
- {
- if (angle+180>toAngle)
- {
- toX=tX + halfToH / k;
- toY=tY - halfToH;
- }
- else
- {
- toX=tX + halfToW;
- toY=tY - halfToW * k;
- }
- }
- ///from坐标换算
- if (angle>0 && angle<=90)
- {
- if (angle>fromAngle)
- {
- fromX=fX + halfFromH / k;
- fromY=fY - halfFromH;
- }
- else
- {
- fromX=fX + halfFromW;
- fromY=fY - halfFromW * k;
- }
- }
- if (angle>90 && angle<=180)
- {
- if (angle+fromAngle>180)
- {
- fromX=fX - halfFromW;
- fromY=fY + halfFromW * k;
- }
- else
- {
- fromX=fX + halfFromH / k;
- fromY=fY - halfFromH;
- }
- }
- if (angle>=-90 && angle<=0)
- {
- if (Math.abs(angle)>fromAngle)
- {
- fromX=fX - halfFromH / k;
- fromY=fY + halfFromH;
- }
- else
- {
- fromX=fX + halfFromW;
- fromY=fY - halfFromW * k;
- }
- }
- if (angle<-90 && angle>=-180)
- {
- if (angle+180>fromAngle)
- {
- fromX=fX - halfFromH / k;
- fromY=fY + halfFromH;
- }
- else
- {
- fromX=fX - halfFromW;
- fromY=fY + halfFromW * k;
- }
- }
- totoX=toX - arrowSize * Math.cos(angle*(Math.PI/180));
- totoY=toY + arrowSize * Math.sin(angle*(Math.PI/180));
- g.lineStyle(thickness,lineColor);
- g.moveTo(fromX,fromY);
- g.lineTo(totoX,totoY);
- var fromItem: Item = (fromView as IDataRenderer).data as Item;
- var toItem: Item = (toView as IDataRenderer).data as Item;
- var node:Object=graph.getLinkData(fromItem,toItem);
- if (node!=null)
- {
- if (node.@id)
- eid=node.@prop;
- // if (node.width)
- // weight=node.width;
- // if (node.bytewidth)
- // bytewidth=node.bytewidth;
- }
- var uit:UITextField = new UITextField();
- uit.textColor = lineColor;
- uit.text = eid;
- uit.autoSize = TextFieldAutoSize.LEFT;
- var textBitmapData:BitmapData = ImageSnapshot.captureBitmapData(uit);
- var sizeMatrix:Matrix = new Matrix();
- var coef:Number = Math.min(uit.measuredWidth/textBitmapData.width,uit.measuredHeight/textBitmapData.height);
- sizeMatrix.a = coef;
- sizeMatrix.d = coef;
- textBitmapData = ImageSnapshot.captureBitmapData(uit,sizeMatrix);
- g.lineStyle(0,0,0);
- var sm:Matrix = new Matrix();
- sm.tx = (fromX+toX)/2;
- sm.ty = (fromY+toY)/2;
- g.beginBitmapFill(textBitmapData,sm,false);
- g.drawRect((fromX+toX)/2,(fromY+toY)/2,uit.measuredWidth,uit.measuredHeight);
- g.endFill();
- drawArrowHead(fromX,fromY,toX,toY,g);
- return true;
- }
- /** 画箭头 **/
- private function drawArrowHead(startX:int,startY:int,endX:int,endY:int,graphics:Graphics):void{
- //得到箭头的角度
- var angle:Number = this.getAngle(startX,startY,endX,endY);
- var centerX:Number = endX - arrowSize * Math.cos(angle*(Math.PI/180));
- var centerY:Number = endY + arrowSize * Math.sin(angle*(Math.PI/180));
- var leftX:Number = centerX + arrowSize * Math.cos((angle+120)*(Math.PI/180));
- var leftY:Number = centerY - arrowSize * Math.sin((angle+120)*(Math.PI/180));
- var rightX:Number = centerX + arrowSize * Math.cos((angle+240)*(Math.PI/180));
- var rightY:Number = centerY - arrowSize * Math.sin((angle+240)*(Math.PI/180));
- graphics.lineStyle(2,lineColor,1);
- graphics.beginFill(lineColor);
- graphics.moveTo(endX,endY);
- graphics.lineTo(leftX,leftY);
- graphics.lineTo(centerX,centerY);
- graphics.lineTo(rightX,rightY);
- graphics.lineTo(endX,endY);
- graphics.endFill();
- }
- /** 得到箭头的角度 **/
- private function getAngle(startX:int,startY:int,endX:int,endY:int):Number{
- var temX:Number = endX - startX;
- var temY:Number = startY - endY;
- var angle:Number = Math.atan2(temY,temX)*(180/Math.PI);
- return angle;
- }
- }
- }
springgraph
最新推荐文章于 2018-04-24 00:19:25 发布