mxgraph 边在画布平移或者放大缩小时候边位置会错乱怎么解决
时间: 2023-12-08 14:03:37 浏览: 81
mxGraph中的边是基于绝对坐标位置计算的,因此在画布平移或缩放时,边的位置可能会发生变化。要解决这个问题,可以在绘制边时重新计算其坐标位置。
具体来说,您可以使用mxGraph的事件监听器来监听画布平移和缩放事件,并在这些事件发生时重新计算边的坐标位置。您可以使用以下代码示例:
```javascript
graph.addListener(mxEvent.SIZE, function(sender, evt)
{
var bounds = graph.getGraphBounds();
var width = bounds.width;
var height = bounds.height;
// 重新计算边的坐标位置
graph.getModel().beginUpdate();
try
{
var cells = graph.getModel().getCells();
for (var i = 0; i < cells.length; i++)
{
var cell = cells[i];
if (graph.getModel().isEdge(cell))
{
var geo = graph.getCellGeometry(cell);
geo.setTerminalPoint(new mxPoint(geo.getTerminalPoint(true).x * width,
geo.getTerminalPoint(true).y * height), true);
geo.setTerminalPoint(new mxPoint(geo.getTerminalPoint(false).x * width,
geo.getTerminalPoint(false).y * height), false);
}
}
}
finally
{
graph.getModel().endUpdate();
}
});
```
在上面的代码中,我们使用`mxEvent.SIZE`事件来监听画布的大小变化。当事件发生时,我们获取画布的宽度和高度,并遍历所有的单元格来重新计算边的坐标位置。
我们首先使用`graph.getModel().getCells()`方法获取所有的单元格,然后使用`graph.getModel().isEdge(cell)`方法来检查单元格是否为边。如果它是一个边,我们就获取其几何形状(`mxGeometry`)并使用`geo.getTerminalPoint(true)`和`geo.getTerminalPoint(false)`方法来获取其起点和终点。我们然后根据画布的新宽度和高度重新计算这些点的位置,并使用`geo.setTerminalPoint()`方法来更新它们的位置。
最后,我们使用`graph.getModel().beginUpdate()`和`graph.getModel().endUpdate()`方法来启用和禁用图形模型的更新。这可以帮助我们避免在重新计算边的坐标位置时出现并发问题。
希望这可以帮助解决您的问题。
阅读全文