自定义箭头
自定义连线箭头标记
演示如何使用 SVG 标记定义创建连接线的自定义箭头标记样式并动态切换。
自定义连线箭头标记
功能概述
此示例演示如何使用 SVG 标记定义创建连接线的自定义箭头标记。提供了多种箭头样式,可以通过选择器在它们之间动态切换。
核心特性实现
定义自定义箭头标记
创建包含 SVG 路径数据的标记配置对象数组:
const myArrows = [
{
viewBox: '0 0 12 12',
markerWidth: 30,
markerHeight: 30,
refX: 3,
refY: 3,
data: 'M 0 0, V 6, L 4 3, Z' // 三角形箭头
},
{
viewBox: '0 0 12 12',
markerWidth: 20,
markerHeight: 20,
refX: 2,
refY: 3,
data: 'M0 0 H6 V6 H0 Z' // 方形箭头
},
{
viewBox: '0 0 12 12',
markerWidth: 30,
markerHeight: 30,
refX: 2,
refY: 3,
data: `M 0 3 A 3 3 0 0 1 6 3 A 3 3 0 0 1 0 3` // 半圆形箭头
},
{
viewBox: "0 0 12 12",
markerWidth: 40,
markerHeight: 40,
refX: 2,
refY: 3,
data: `M 4 6, V 0, L 0 3, Z` // 自定义形状
}
];
通过选项应用自定义箭头
设置 defaultLineMarker 选项以将自定义箭头应用于所有连线:
const graphOptions: RGOptions = {
defaultLineMarker: myArrows[myArrowIndex]
};
动态箭头切换
通过更改索引和更新选项来更新箭头样式:
useEffect(() => {
graphInstance.updateOptions({
defaultLineMarker: myArrows[myArrowIndex]
});
}, [myArrowIndex]);
布局切换
在树形和中心布局之间切换并进行适当的形状更改:
const onLayoutNameChanged = async () => {
if (layoutName === 'center') {
graphInstance.updateOptions({
defaultNodeShape: RGNodeShape.circle,
defaultLineShape: RGLineShape.StandardStraight,
defaultJunctionPoint: RGJunctionPoint.border,
layout: { layoutName: layoutName }
});
} else {
graphInstance.updateOptions({
defaultNodeShape: RGNodeShape.rect,
defaultLineShape: RGLineShape.StandardCurve,
defaultJunctionPoint: RGJunctionPoint.lr,
layout: { layoutName: layoutName }
});
}
await graphInstance.doLayout();
graphInstance.moveToCenter();
graphInstance.zoomToFit();
};
箭头选择界面
提供下拉菜单以选择不同的箭头样式:
<SimpleUISelect
data={[
{ value: 0, text: 'My Arrow 1' },
{ value: 1, text: 'My Arrow 2' },
{ value: 2, text: 'My Arrow 3' },
{ value: 3, text: 'My Arrow 4' }
]}
currentValue={myArrowIndex}
onChange={(newValue: number) => { setMyArrowIndex(newValue); }}
/>
创意使用场景
- 数据流图:为不同的数据类型使用不同的箭头
- 流程图:用方向指示器表示流程类型
- 网络拓扑:使用不同的箭头显示连接类型
- 状态机:为状态转换使用自定义箭头
- 生物途径:为分子相互作用使用专门的箭头