为了实现蚂蚁线动画效果,可以使用gojs库中的动画和数据模型功能。下面是实现该效果的完整攻略:
- 创建GoJS图表数据模型
蚂蚁线动画效果需要使用GoJS的Layout模块。在Layout模块的输入上,需要创建一个数据模型,以描述要排列的节点及它们之间的连接关系。数据模型可以由JSON对象创建,包含节点和联系人数组。示例:
var data = {
nodeDataArray: [
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" }
],
linkDataArray: [
{ from: "Alpha", to: "Beta" },
{ from: "Beta", to: "Gamma" }
]
};
2.对GoJS图表进行布局
GoJS提供了一些布局方法,用于自动布局图表中的元素。在实现蚂蚁线动画效果时,可以使用TreeLayout。TreeLayout可以将节点自动排列成一棵树,例如将根节点放在顶部,将子节点按从左到右的顺序放置。示例:
var myDiagram = $(go.Diagram, "myDiagramDiv");
myDiagram.nodeTemplate =
$(go.Node, "Auto", $(go.Shape, "Rectangle", { fill: "white" }), $(go.TextBlock, { margin: 8 }, new go.Binding("text", "key")));
myDiagram.linkTemplate = $(go.Link, $(go.Shape));
myDiagram.model = new go.GraphLinksModel(data.nodeDataArray, data.linkDataArray);
var layout = $(go.TreeLayout);
myDiagram.layout = layout;
- 添加蚂蚁线动画
为了添加蚂蚁线动画,需要将所有的链接旋转一定角度,并在它们附近添加一个蚂蚁线条。可以使用Link.rotationAngle属性来旋转每个链接,使用Link.fromPort的实际坐标计算蚂蚁线的起点,用Link.toPort的坐标计算蚂蚁线的终点。示例:
var it = layout.network.edges.iterator;
while (it.next()) {
var link = it.value.link;
link.rotationAngle = Math.random() * 360;
var ants = $(go.Panel);
ants.add($(go.Shape, { stroke: "red", strokeWidth: 1, strokeDashArray: [1, 1], height: 0, width: 5 }));
ants.visible = true;
link.add(ants);
var anim = new go.Animation();
anim.duration = 2000;
anim.easing = go.Animation.EaseOutExpo;
var parts = ants.findObjectsIn(ants.actualBounds);
var animationProperties = { height: 10 };
anim.add(parts, animationProperties);
var animationProperties = { width: 0 };
anim.add(parts, animationProperties);
anim.start();
}
在以上示例代码中,动画蚂蚁线的颜色为红色,默认起始长度为0,宽度为5。并且动画时间为2秒,使用EaseOutExpo模式进行缓动。最后,将动画和动画属性添加到go.Animation实例中并开始动画。
- 添加节点和连线
最后一步是添加一些新的节点和链接,以便可以看到动画效果。示例:
var newNodes = [
{ key: "Delta", color: "cyan" },
{ key: "Epsilon", color: "magenta" }
];
var newLinks = [
{ from: "Alpha", to: "Delta" },
{ from: "Delta", to: "Beta" },
{ from: "Beta", to: "Epsilon" },
{ from: "Epsilon", to: "Gamma" }
];
myDiagram.model.addNodeDataCollection(newNodes);
myDiagram.model.addLinkDataCollection(newLinks);
在以上示例中,将新节点Delta和Epsilon添加到数据模型中,创建连接它们和现有节点的新链接,并且实现了动画蚂蚁线。
- 示例说明
(1) 示例1: 在GoJS基础示例中添加蚂蚁线动画
<!DOCTYPE html>
<html>
<head>
<title>GoJS蚂蚁线动画效果示例1</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdnjs.cloudflare.com/ajax/libs/gojs/2.1.14/go.js"></script>
</head>
<body>
<div id="myDiagramDiv" style="width:800px;height:400px"></div>
<button onclick="addNodes()">添加节点和链接</button>
<script>
var myDiagram = $(go.Diagram, "myDiagramDiv");
myDiagram.nodeTemplate =
$(go.Node, "Auto", $(go.Shape, "Rectangle", { fill: "white" }), $(go.TextBlock, { margin: 8 }, new go.Binding("text", "key")));
myDiagram.linkTemplate = $(go.Link, $(go.Shape));
var data = {
nodeDataArray: [
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" }
],
linkDataArray: [
{ from: "Alpha", to: "Beta" },
{ from: "Beta", to: "Gamma" }
]
};
myDiagram.model = new go.GraphLinksModel(data.nodeDataArray, data.linkDataArray);
var layout = $(go.TreeLayout);
myDiagram.layout = layout;
var it = layout.network.edges.iterator;
while (it.next()) {
var link = it.value.link;
link.rotationAngle = Math.random() * 360;
var ants = $(go.Panel);
ants.add($(go.Shape, { stroke: "red", strokeWidth: 1, strokeDashArray: [1, 1], height: 0, width: 5 }));
ants.visible = true;
link.add(ants);
var anim = new go.Animation();
anim.duration = 2000;
anim.easing = go.Animation.EaseOutExpo;
var parts = ants.findObjectsIn(ants.actualBounds);
var animationProperties = { height: 10 };
anim.add(parts, animationProperties);
var animationProperties = { width: 0 };
anim.add(parts, animationProperties);
anim.start();
}
function addNodes() {
var newNodes = [
{ key: "Delta", color: "cyan" },
{ key: "Epsilon", color: "magenta" }
];
var newLinks = [
{ from: "Alpha", to: "Delta" },
{ from: "Delta", to: "Beta" },
{ from: "Beta", to: "Epsilon" },
{ from: "Epsilon", to: "Gamma" }
];
myDiagram.model.addNodeDataCollection(newNodes);
myDiagram.model.addLinkDataCollection(newLinks);
}
</script>
</body>
</html>
(2) 示例2: Json数据动态添加节点和链接
<!DOCTYPE html>
<html>
<head>
<title>GoJS蚂蚁线动画效果示例2</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdnjs.cloudflare.com/ajax/libs/gojs/2.1.14/go.js"></script>
</head>
<body>
<div id="myDiagramDiv" style="width:800px;height:400px"></div>
<input type="text" id="txtAddNode1" placeholder="输入1号节点" />
<input type="text" id="txtAddNode2" placeholder="输入2号节点" />
<button onclick="addNodes()">添加节点和链接</button>
<script>
var data = {
nodeDataArray: [
{ key: "Alpha", color: "lightblue" },
{ key: "Beta", color: "orange" },
{ key: "Gamma", color: "lightgreen" }
],
linkDataArray: [
{ from: "Alpha", to: "Beta" },
{ from: "Beta", to: "Gamma" }
]
};
var myDiagram = $(go.Diagram, "myDiagramDiv");
myDiagram.nodeTemplate =
$(go.Node, "Auto", $(go.Shape, "Rectangle", { fill: "white" }), $(go.TextBlock, { margin: 8 }, new go.Binding("text", "key")));
myDiagram.linkTemplate = $(go.Link, $(go.Shape));
myDiagram.model = new go.GraphLinksModel(data.nodeDataArray, data.linkDataArray);
var layout = $(go.TreeLayout);
myDiagram.layout = layout;
var it = layout.network.edges.iterator;
while (it.next()) {
var link = it.value.link;
link.rotationAngle = Math.random() * 360;
var ants = $(go.Panel);
ants.add($(go.Shape, { stroke: "red", strokeWidth: 1, strokeDashArray: [1, 1], height: 0, width: 5 }));
ants.visible = true;
link.add(ants);
var anim = new go.Animation();
anim.duration = 2000;
anim.easing = go.Animation.EaseOutExpo;
var parts = ants.findObjectsIn(ants.actualBounds);
var animationProperties = { height: 10 };
anim.add(parts, animationProperties);
var animationProperties = { width: 0 };
anim.add(parts, animationProperties);
anim.start();
}
function addNodes() {
var newNodes = [
{ key: document.getElementById("txtAddNode1").value, color: "cyan" },
{ key: document.getElementById("txtAddNode2").value, color: "magenta" }
];
var newLinks = [
{ from: "Alpha", to: document.getElementById("txtAddNode1").value },
{ from: document.getElementById("txtAddNode1").value, to: "Beta" },
{ from: "Beta", to: document.getElementById("txtAddNode2").value },
{ from: document.getElementById("txtAddNode2").value, to: "Gamma" }
];
myDiagram.model.addNodeDataCollection(newNodes);
myDiagram.model.addLinkDataCollection(newLinks);
}
</script>
</body>
</html>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:gojs实现蚂蚁线动画效果 - Python技术站