springGraph edge Renderer


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;
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值