gojs拓扑图实现节点外围圆环按钮

本文介绍如何使用 GoJS 库实现一个自定义的径向菜单,该菜单在鼠标悬停时改变背景颜色,并详细展示了如何通过 JavaScript 编程创建圆形扇形和环形交叉的按钮,以及如何在节点点击时显示或隐藏该菜单。

实现效果:(并且鼠标移上去改变背景颜色)

官方案例参考:https://gojs.net/latest/samples/radialAdornment.html

珊妹儿这就给大家献上代码:

一、首先引用文件:

<script type="text/javascript" src="./js/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="./js/gojs/go.js"></script>
<script type="text/javascript" src="./js/gojs/OverviewResizingTool.js"></script>
<script src="./js/gojs/DrawCommandHandler.js"></script>

二、在原有的拓扑图的基础上添加代码js:(这是定义一个圆环,写在init方法外面的)

    //制作一个圆形扇形和环形交叉的“按钮”。
    //第一个参数是按钮相对于中心放置的角度。
    //第二个参数是按钮将延伸的扫描角度;
    //默认情况下,这是90度,好像在整个圆周围正好有四个按钮。
  go.GraphObject.defineBuilder("SectorButton", function(args) {
    var angle = go.GraphObject.takeBuilderArgument(args, 0.0, function(a) { return typeof a === "number"; });
    var sweep = go.GraphObject.takeBuilderArgument(args, 90.0, function(a) { return typeof a === "number"; });
    // default brushes for "Button" shape
    var buttonFillNormal = "whitesmoke";
    var buttonStrokeNormal = "gray";

    var buttonFillOver = "#E7B5F4";
    var buttonStrokeOver = "#C709F7";

    var buttonFillDisabled = "darkgray";

    function makeAnnularWedge(angle, sweep, outer, inner) {
      // 几何体将以(0,0)为中心
      var p = new go.Point(outer, 0).rotate(angle - sweep / 2);
      var q = new go.Point(inner, 0).rotate(angle + sweep / 2);
      var geo = new go.Geometry()
        .add(new go.PathFigure(-outer, -outer))  // 始终确保几何体包括左上角
        .add(new go.PathFigure(outer, outer))    // 以及整个圆形区域的右下角
        .add(new go.PathFigure(p.x, p.y)  // 从外角开始,顺时针走
        .add(new go.PathSegment(go.PathSegment.Arc, angle - sweep / 2, sweep, 0, 0, outer, outer))
        .add(new go.PathSegment(go.PathSegment.Line, q.x, q.y))  // 然后逆时针旋转
        .add(new go.PathSegment(go.PathSegment.Arc, angle + sweep / 2, -sweep, 0, 0, inner, inner).close()));
      return geo;
    }

    var geo = makeAnnularWedge(angle, sweep, 80, 40);

    var pt = new go.Point(60, 0).rotate(angle);
    var align = new go.Spot(0.5, 0.5, pt.x, pt.y);
    args.forEach(function(obj) { if (obj instanceof go.GraphObject) obj.alignment = align; });

    var button =
      go.GraphObject.make(go.Panel, "Spot",
        {
          isActionable: true,  // 需要这样ActionTool才能截获鼠标事件
          enabledChanged: function(button, enabled) {
            var shape = button.findObject("ButtonBorder");
            if (shape !== null) {
              shape.fill = enabled ? button["_buttonFillNormal"] : button["_buttonFillDisabled"];
            }
          },
          // 为mouseEnter和mouseLeave事件处理程序保存这些值
          "_buttonFillNormal": buttonFillNormal,
          "_buttonStrokeNormal": buttonStrokeNormal,
          "_buttonFillOver": buttonFillOver,
          "_buttonStrokeOver": buttonStrokeOver,
          "_buttonFillDisabled": buttonFillDisabled
        },
        go.GraphObject.make(go.Shape,  // the border
          {
            name: "ButtonBorder",
            fill: buttonFillNormal,
            stroke: buttonStrokeNormal,
            geometry: geo
          })
      );

    //按钮形状内没有GraphObject——它必须作为按钮定义的一部分添加。
    //这样,对象可以是文本块、形状、图片或任意复杂的面板。

    // mouse-over behavior
    button.mouseEnter = function(e, button, prev) {
      var shape 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值