GEF锚点定位学习,实现鼠标定位


GEF模型之间的连线,两端连接点,为锚点,默认的锚点定位在模型边框的中间位置。

要实现锚点连线功能,所对应的editpart必须继承NodeEditPart类,这个类主要封转四个类:

ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection);

ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection);

ConnectionAnchor getSourceConnectionAnchor(Request request);

ConnectionAnchor getTargetConnectionAnchor(Request request);

这四个方法就是返回连线锚点的,默认实现是 ChopboxAnchor(IFigure owner)这个方法,这个方法最主要的方法是getlocation方法,要实现锚点的其它定位,主要也是重写这个方法。但默认的是不完全可以实现一些特殊需求的,所以我实现了通过鼠标位置定位锚点位置的方法:主要通过连线模型,取得鼠标距离最近的中点,无论鼠标在什么位置,他都可以自动的转到离鼠标位置最近的中点位置。主要实现就是在上面提到的四个方法中实现。由创建连接的命令 (CreateConnectionRequest) request.getLocation()得到鼠标当前位置

	Point loc = r.getLocation();
			Rectangle rect = Rectangle.SINGLETON;
			rect.setBounds(part.getFigure().getBounds());
			part.getFigure().translateToAbsolute(rect);
			Point ref = rect.getCenter();
			double dx = loc.x - ref.x;
			double dy = loc.y - ref.y;
			System.out.println(Math.atan2(dy, dx));

通过以上方法,得到鼠标位置,通过转换未相对位置,然后分别得到相应的xy。

		/** 根据鼠标位置算成上下左右四个点最近的位置,设置锚点 */
			if (Math.atan2(dy, dx) >= -2.25 && Math.atan2(dy, dx) <= -0.75) {
				anchor.setAngle(-1.5);
			} else if (Math.atan2(dy, dx) >= -0.75
					&& Math.atan2(dy, dx) <= 0.75) {
				anchor.setAngle(0);
			} else if (Math.atan2(dy, dx) >= 0.75 && Math.atan2(dy, dx) <= 2.25) {
				anchor.setAngle(1.5);
			} else {
				anchor.setAngle(-3.12);
			}

通过以上的判断设置锚点的角度对应位置。source跟target的实现其实是完全一样的,就是source换成target。

看似比较简单,但是其实是比较复杂的,特别是那些算法,简直是坑爹的,让人昏头转向,具体可以看看我的源代码,因为这是一个公司项目的,所以工程就不上传了,只上传实现这个功能的代码,希望对大家有所帮助!

代码地址:http://download.csdn.net/detail/lpc2008/3869437

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值