vue2 antv x6 入门 (二)画布适应、节点、边

1、画布大小

画布自适应当前窗体大小

在实例化 Graph 对象的时候,可以通过设置 width 和 height 固定画布大小,如果不设置,就会以画布容器大小初始化画布。

在项目实践中,经常会遇到下面两种场景:

画布容器还没有渲染完成(此时尺寸为 0),就实例化画布对象,导致画布元素显示异常。

页面的 resize 导致画布容器大小改变,导致画布元素显示异常。

我们可以使用 autoResize 配置来解决上述问题。

const graph = new Graph({

container: document.getElementById('container'),

autoResize: true,

})

内容居中 fromJSON 加载数据

this.graph.fromJSON(dataJSON) // 渲染元素

this.graph.on('render:done', () => {

console.log('渲染完毕')

setTimeout(() => {

this.graph.centerContent() // 居中显示

}, 10)

})

窗体大小改变 内容居中:

window.addEventListener('resize', this.handleResize)

handleResize() {

this.graph.centerContent() // 居中显示

},

示例代码: 监听窗体大小 、 防抖

//首先写一个获取窗口宽高的方法

const getWindowInfo = () => {

const windowInfo = {

width: window.innerWidth,

hight: window.innerHeight

}

console.log(windowInfo);

};

//需要防抖,无论我们怎么拖动窗口大小,只执行一次获取浏览器宽高的方法

//方法只会在窗口停止变化的 500 毫秒后触发一次

const debounce = (fn, delay) => {

let timer;

return function () {

if (timer) {

clearTimeout(timer);

}

timer = setTimeout(() => {

fn();

}, delay);

}

};

const cancalDebounce = debounce(getWindowInfo, 500);

//然后监听 resize 事件

window.addEventListener('resize', cancalDebounce);

2、画布背景与网格

background: 'red'

grid: true

--------------

background: {

color: '#F2F7FA',

},

grid: {

visible: true,

type: 'doubleMesh',

args: [

{

color: '#eee', // 主网格线颜色

thickness: 1, // 主网格线宽度

},

{

color: '#ddd', // 次网格线颜色

thickness: 1, // 次网格线宽度

factor: 4, // 主次网格线间隔

},

],

}

3、缩放与平移

Graph 中通过 panning 和 mousewheel 配置来实现这两个功能,鼠标按下画布后移动时会拖拽画布,滚动鼠标滚轮会缩放画布

panning: true,

mousewheel: true,

常用API

graph.resize(800, 600) // resize 画布大小

graph.translate(20, 20) // 在 x、y 方向上平移画布

graph.zoom(0.2) // 将画布缩放级别增加 0.2(默认为1)

graph.zoom(-0.2) // 将画布缩放级别减少 0.2

graph.zoomTo(1.2) // 将画布缩放级别设置为 1.2

// 将画布中元素缩小或者放大一定级别,让画布正好容纳所有元素,可以通过 maxScale 配置最大缩放级别

graph.zoomToFit({ maxScale: 1 })

graph.centerContent() // 将画布中元素居中展示

节点渲染方式

X6 是基于 SVG 的渲染引擎,可以使用不同的 SVG 元素渲染节点和边,非常适合节点内容比较简单的场景。面对复杂的节点, SVG 中有一个特殊的 foreignObject 元素,在该元素中可以内嵌任何 XHTML 元素,可以借助该元素来渲染 HTML、React/Vue/Angular 组件到需要位置,这会给项目开发带来非常大的便利。

在选择渲染方式时我们推荐:

如果节点内容比较简单,而且需求比较固定,使用 SVG 节点

其他场景,都推荐使用当前项目所使用的框架来渲染节点

添加节点

节点和边都有共同的基类 Cell,除了从 Cell 继承属性外,还支持以下选项。

graph.addNode({

shape: 'rect',

x: 100,

y: 40,

width: 100,

height: 40,

})

内置节点

graph.addNode({

shape: 'image',

x: 290,

y: 150,

width: 60,

height: 40,

imageUrl:

'https://gw.alipayobjects.com/os/s/prod/antv/assets/image/logo-with-text-73b8a.svg',

label: 'image',

attrs: commonAttrs,

})

定制节点

我们可以通过 markup 和 attrs 来定制节点的形状和样式,markup 可以类比 HTML,attrs 类比 CSS。强烈建议仔细阅读 markup 和 attrs 文档。

Graph.registerNode(

'custom-node',

{

inherit: 'rect', // 继承于 rect 节点

width: 100,

height: 40,

markup: [

{

tagName: 'rect', // 标签名称

selector: 'body', // 选择器

},

{

tagName: 'image',

selector: 'img',

},

{

tagName: 'text',

selector: 'label',

},

],

attrs: {

body: {

stroke: '#8f8f8f',

strokeWidth: 1,

fill: '#fff',

rx: 6,

ry: 6,

},

img: {

'xlink:href':

'https://gw.alipayobjects.com/zos/antfincdn/FLrTNDvlna/antv.png',

width: 16,

height: 16,

x: 12,

y: 12,

},

},

},

true,

)

this.graph.addNode({

shape: 'custom-node', // 可以直接使用上面注册过的 shape

x: 40,

y: 40,

label: 'hello'

})

修改节点

node.prop(path, value),详细使用见 prop。

node.attr(path, value),详细使用见 attr。

source.prop('size', { width: 120, height: 50 }) // 修改 x 坐标

source.attr('rect/fill', '#ccc') // 修改填充色,等价于 source.prop('attrs/rect/fill', '#ccc')

添加边

节点和边都有共同的基类 Cell,

graph.addEdge({

shape: 'edge',

source: 'node1',

target: 'node2',

})

Copyright © 2022 ZGC网游最新活动_热门游戏资讯_玩家互动社区 All Rights Reserved.