!!!###!!!title=交互行为——VisActor/VGraph 教程文档!!!###!!!!!!###!!!description=vGraph 精心打磨沉淀了一些在图分析场景下高频使用的交互,可按需自行引用注册到 graph 示例中即可使用。一般用法如下:!!!###!!!

交互行为

vGraph 精心打磨沉淀了一些在图分析场景下高频使用的交互,可按需自行引用注册到 graph 示例中即可使用。一般用法如下:

panZoom 平移缩放

panZoom 适配了触摸板和鼠标的平移缩放操作。触摸板双指平移即画布平移,双指捏合即画布缩放。鼠标滚轮滚动画布缩放。是图分析中最常用的交互行为。每次触发平移缩放操作,即会在 graph 实例上触发 transformed 事件。可用 graph.on('transformed', e => {...}) 事件中使用 graph.getZoomRatio() 方法更新缩放 ui 的缩放比。

import { panZoom } from '@visactor/vgraph';

// 添加平移缩放交互
graph.addBehavior(panZoom, { ...options });
// 删除交互
graph.removeBehavior(panZoom);
配置项类型描述
sensitivitynumber缩放灵敏度,默认为 2。数值越大缩放比越大
keyShapeOnlyboolean是否在平移缩放期间仅显示关键图形,建议数据量大时开启
showKeyShapeDelaynumber平移缩放后显示全量图形的延迟 (ms)
xOnlyboolean仅开启水平方向平移
yOnlyboolean仅开启垂直方向平移
limitboolean仅允许在有图形的区域平移
paddingnumber与 limit 配合使用,允许平移范围的留白
zoomboolean是否允许缩放,默认为 true
autoPreventDefaultboolean是否自动阻止浏览器默认行为,例如左滑后退等。默认为 true。可与 shouldTrigger 配合使用。
shouldTrigger(evt: WheelEvent, graph: Graph | TreeGraph) => boolean是否允许执行本次缩放平移

dragCanvas 拖拽画布

鼠标拖拽画布空白区域平移画布,一般与 panZoom 一同使用,作为鼠标平移的交互补充

import { dragCanvas } from '@visactor/vgraph';

// 添加鼠标拖拽画布交互
graph.addBehavior(dragCanvas, { ...options });
// 删除交互
graph.removeBehavior(dragCanvas);
配置项类型描述
canvasOnlyboolean默认 canvasOnly:true 只有拖拽空白画布处会触发此交互。置为 false 则会响应全局拖拽。若节点连线上有其他拖拽操作请勿置 false。
limitboolean仅允许在有图形的区域平移
paddingnumber与 limit 配合使用,允许平移范围的留白

dragNode 拖拽节点

拖拽节点也是图分析中常见的交互,在图分析中往往用于让用户对图的结构进行重新组织整理。

import { dragNode } from '@visactor/vgraph';

// 添加拖拽节点交互
graph.addBehavior(dragNode, { ...options });
// 删除交互
graph.removeBehavior(dragNode);
配置项类型描述
delegateboolean默认 delegate:true 新创建一个图形拖拽在拖拽过程中不改变原来布局。false 时直接拖拽节点本身。下图为 delegate: true 的效果。
delegateStyles绘图属性,详细可见rect 配置指定创建的图形样式,对 delegate:true 的配置有效
shouldTrigger(e: GraphEvent, shape: Shape) => boolean是否允许拖拽节点
shouldDrop(e: GraphEvent) => boolean是否允许放置节点
autoTranslateboolean鼠标拖拽到视窗边缘时是否自动滚动画布
onDragStart(node: Node, e: GraphEvent) => void节点开始拖拽事件
onDrag(node: Node, x: number, y: number) => void节点拖拽位置更新事件
onDrop(node: Node) => void节点放置事件
onDragEnter(node: Node, x: number, y: number) => void拖拽鼠标点进入了节点范围内触发
onDragLeave(node: Node) => void拖拽鼠标点移出了节点范围后触发
xOnlyboolean仅开启水平方向拖拽
yOnlyboolean仅开启垂直方向拖拽

highlightRelations 展示联系

鼠标 hover/click 节点高亮直接邻居节点,与图中实体的状态结合能辅助查看节点之间的联系。

import { highlightRelations } from '@visactor/vgraph';

// 添加高亮关联节点交互
graph.addBehavior(highlightRelations, { ...options });
// 删除交互
graph.removeBehavior(highlightRelations);
配置项类型描述
trigger'hover' | 'click'默认为 hover。高亮关系的触发方式
activeNodeStatestring默认为 active。需要在 graph 中配置 active 状态对应样式变化
activeEdgeStatestring默认为 active。需要在 graph 中配置 active 状态对应样式变化
blurNodeStatestring默认为 blur。需要在 graph 中配置 blur 状态对应样式变化
blurEdgeStatestring默认为 blur。需要在 graph 中配置 blur 状态对应样式变化

以下是 highlightRelations 交互与状态结合使用的简单例子。

import { Graph, highlightRelations } from '@visactor/vgraph';
const graph = new Graph({
    ...
    setNodeStateStyles(state: string) {
      if (state === 'active') {
        return {
          fillStyle: '#dd8452',
        };
      }
      return { opacity: 0.2 };
    },
    setEdgeStateStyles(state: string) {
      if (state === 'active') {
        return {
          strokeStyle: '#55a868',
        };
      }
      return { opacity: 0.2 };
    },
  });
  graph.addBehavior(highlightRelations);
  // 添加配置项 trigger 可切换为点击高亮关系
  // graph.addBehavior(highlightRelations, { trigger: 'click' });

hideDetails 隐藏细节

当图的缩放比过小时通常认为用户会更关注数据的整体分布情况,而不是单个节点细节。此交互能在此突出整体结构上的信息而隐藏节点细节,与图中实体的状态结合可以在缩小时突出一些关键信息。

配置项类型描述
hideRationumber现有图缩放到原图的百分比会触发隐藏,默认 0.2
hideStatestring当节点隐藏细节时给节点添加状态

以下是 hideDetails 与节点状态结合使用,在图缩小时总览整体结构同时能看清每个节点分组的简单示例。

import { Graph, hideDetails } from '@visactor/vgraph';

const graph = new Graph({
    ...
    setNodeStateStyles(state: string, nodeData: any) {
      if (state === 'hide') {
        return { fillStyle: nodeData.color };
      }
    },
  });
  graph.addBehavior(hideDetails, {
      hideRatio: 0.4,
      hideState: 'hide',
  });

showDetails 展示细节

当图中节点较多往往会遇到节点的文本标签相互重叠看不清的问题。showDetails 用于解决这个问题。使用这个交互时会认为默认状态下用户是看全图结构,而在放大时展示节点等的细节。

配置项类型描述
showRationumber现有图放大到原图的百分比会触发隐藏,默认 1.5
targetsstring[]展示哪些实体的 label。默认为 [ node ]。
showNodeStatestring当节点展示细节时给节点添加状态
showEdgeStatestring当连线展示细节时给连线添加状态,需在 targets 中配置 'edge'

attachableDragNode 吸附式拖拽节点

拖拽树节点是树图应用中一种常用的数据重组手段,vGraph 内置了吸附式拖拽交互,所见即所得地组织数据,能显著提升用户体验。应用可参考重组树节点

import { attachableDragNode } from '@visactor/vgraph';

// 添加吸附式拖拽节点交互
graph.addBehavior(attachableDragNode, { ...options });
// 删除交互
graph.removeBehavior(attachableDragNode);
配置项类型描述
delegatebooleandelegate 为 true 时会新创建一个图形拖拽在拖拽过程中不改变原来布局。false 时直接拖拽节点本身。
delegateStyles绘图属性,详细可见rect 配置代理图形样式默认为被移动节点 keyShape 的样式,可以自行配置
tempEdgeStyles绘图属性,详细可见path 配置当被拖拽节点自动吸附到另一节点时,示意的连线样式
shouldTrigger(e: GraphEvent, target: Shape) => boolean是否允许拖拽当前节点
shouldDrop(e: GraphEvent, target: Node, parent: Node) => boolean是否允许拖拽 target 为 parent 的子节点
onDragStart(target: Node, e: GraphEvent) => void开始退拽节点事件
onDrag(overNode: Node, e: GraphEvent) => boolean事件在用户拖拽节点过程中持续被触发
onDrop(target: Node, parent: Node, e:GraphEvent) => boolean节点能被有效吸附时触发
onAttachNode(parent: Node) => Node是否允许吸附到指定节点
findClosestNode(target: Node) => boolean根据被拖拽节点的位置自行计算可吸附节点位置,默认为找到距离最小的节点。应用可参考重组树节点

brushSelect 框选

框选是一种便利的批量数据选择组件,vGraph 内置了框选交互,可以用于对节点、连线、分组进行批量选中。应用可参考框选 demo

import { brushSelect } from '@visactor/vgraph';

// 添加框选交互
graph.addBehavior(brushSelect, { ...options });
// 删除交互
graph.removeBehavior(brushSelect);
配置项类型描述
targetsstring[]可选中对象,可以是一种或多种,可选值有 'node', 'edge', 'group'
bkgStylesRecord<string, any>选中范围方框的样式,详细可见rect 配置,注意请配置 opacity 透明度
autoTranslateboolean是否在鼠标选中到视窗边缘时自动滚动画布,默认为 true
canvasOnlyboolean是否仅在空白画布上选中时开始框选,默认为 true。当图中同时有 dragNode 交互时建议开启。
shouldTrigger(e: GraphEvent) => boolean是否允许开始框选
onSelect(entity: Node | Edge | Group) => boolean拖拽过程中选中某个对象的事件, 当返回 false 时该节点不会被选中
onDeSelect(entity: Node | Edge | Group) => void拖拽过程中取消选中某个对象的事件
onChange(entity: (Node | Edge | Group)[]) => void框选完成事件

multipleSelect 多选

多选是一种通用的数据选择组件,允许用户按住修饰键的同时点选/反选图中元素,达到比框选更精确灵活的数据选择效果。

import { multipleSelect } from '@visactor/vgraph';

// 添加框选交互
graph.addBehavior(multipleSelect, { ...options });
// 删除交互
graph.removeBehavior(multipleSelect);
配置项类型描述
multipleboolean是否允许多选,默认为 true
targetsstring[]可以选中的元素类型,默认为 ['node', 'edge', 'group']
modifierKeystring[]自定义修饰键,默认为 [ 'ctrlKey', 'metaKey' ]
selectStatestring选中元素时给元素添加状态名,反选时也会取消此状态
clickCanvasToResetboolean点击空白区域时取消所有选中态
shouldSelectItem(ev: GraphEvent, selections: []) => boolean当前点击的节点是否可以被选中
onSelectionsChange(selections: []) => void选中元素发生变化回调