【前端学习】AntV G6-09 复杂的自定义边、边动画

课程视频

AntV G6:复杂的自定义边、边动画(上)_哔哩哔哩_bilibili

AntV G6:复杂的自定义边、边动画(下)_哔哩哔哩_bilibili

讲义截图

G6有2种内置的曲线,二阶贝塞尔曲线和三阶贝塞尔曲线。它们的区别就是控制点个数的多少。

二阶贝塞尔曲线如果算上两个端点,其实总共有三个控制点。但我们通过边的配置control points,可以指定中间这个控制点的位置,从而控制这条贝塞尔曲线的弯曲方式。当我们不指定control points的时候,也可以通过配置curve position和curveOffSet两个字段来间接的指定控制点的位置。curve position指的是这条边的起点到终点连线所在的0到1的一个百分比位置,默认情况下的curve position是他们的中央,也就是0.5。curve position指的是这个控制点到这个两端点连线的距离。

三阶贝塞尔曲线则是有两个控制点,可以通过配置边的control points为2个XY对象控制这条边的绘制方式。当然也同样的在不指定control points的时候,指定current position和curveOffSet来间接指定它们的弯曲方式。默认情况下,三阶贝塞尔曲线的curve position也是在两端点连线的中央位置。由于它是有两个控制点,所以它是一个二维数组。curveOffSet同样也是一个二维数组,分别指定第一个和第二个控制点距离这个连线的距离。

我们可以发现贝塞尔曲线的控制点实际上并不在这个曲线上,折线则不同,折线的控制点是实际上就是折线的拐点,这些控制点在折线上。通过配置control points,我们可以指定任意个数、任意位置的控制点。当我们不指定control points的时候,内置的折线poly line将会使用 A* 自动寻径的算法,但这个算法计算复杂度比较高。而使用control points的坐标作为具体的拐折点位置,没有办法动态的根据起点和终点去调整折线的弯曲。因此很多情况下我们会为了性能和美观的考虑,结合自己的业务诉求去自定义折现的路径。

提及链接

https://codesandbox.io/p/sandbox/register-polyline-getpath-jkd6dn

G6

实例讲解

(从第一个课程链接的04:10开始)

【视频代码(附注释)】

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>07 复杂的自定义边、边动画</title>
	<!-- 引入 G6 -->
	<script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script>
	<!-- <script src="https://gw.alipayobjects.com/os/lib/antv/g6/3.7.1/dist/g6.min.js"></script> -->
</head>

<body>
	<div id="container"></div>
	<script>
		// 思路
		// 1.自定义(边类型)折线 G6.registerEdge, 复写getPath方法
		// 2.复写afterDraw方法 增加hover效果
		// 3.当鼠标进入边时更改边设置状态 graph.on('edge:mouseenter'...
		// 4.捕获状态变化 setState()
		// 5.afterUpdate 更新halo路径,与keyShape同步
		// 6.afterUpdate 更新endLabel位置,与keyShape同步
		// 7.动画,点击端点的时候相关的边产生虚线

		const { getLabelPosition, transform } = G6.Util;

		// 控制path的虚线运动
		const lineDashAnimate = (path) => {
			const lineDash = [6, 4, 2, 4];
			path.attr('lineDash', lineDash)			
			let index = 0;
			path.stopAnimate();
			path.animate((ratio) => {
				index++
				if (index > 16) {
					index = 0
				}
				return {
					lineDashOffset: index
				}
			}, {
				repeat: true, // whether executes the animation repeatly
				duration: 3000 // the duration for executing once
			})

		}

		// 自定义(边类型)折线
		// 参数1 边的名字,参数2 复写,参数3 继承的边类
### G6 自定义的使用方法 在 G6 图可视化库中,可以通过扩展内置功能来自定义。以下是关于如何创建和使用自定义的具体说明以及示例代码。 #### 创建自定义 要创建一条自定义,需通过 `registerEdge` 方法注册一个新的类型[^1]。此方法允许开发者指定的行为及其绘制逻辑。具体来说,需要提供以下参数: - **名称**: 新类型的唯一标识符。 - **配置项**: 定义新的核心属性,包括默认样式、事件处理程序等。 下面是一个简单的例子,展示如何注册并使用一条带有箭头的直线作为自定义[^2]: ```javascript // 注册自定义 G6.registerEdge('customArrow', { draw(cfg, group) { // cfg 是数据模型中的单条的数据,group 是该所属于的容器 const startPoint = cfg.startPoint; // 起始点坐标 const endPoint = cfg.endPoint; // 结束点坐标 // 添加线段 shape const line = group.addShape('line', { attrs: { x1: startPoint.x, y1: startPoint.y, x2: endPoint.x, y2: endPoint.y, stroke: '#000' // 设置线条颜色 }, name: 'edge-line' }); // 计算箭头位置 const diffX = endPoint.x - startPoint.x; const diffY = endPoint.y - startPoint.y; const length = Math.sqrt(diffX * diffX + diffY * diffY); const unitX = diffX / length; const unitY = diffY / length; // 箭头顶点的位置 const arrowPointX = endPoint.x - (unitX * 8); // 长度调整因子为8 const arrowPointY = endPoint.y - (unitY * 8); // 左侧箭头顶点 const leftArrowX = arrowPointX + (-unitY * 4); // 偏移量设置为4 const leftArrowY = arrowPointY + (unitX * 4); // 右侧箭头顶点 const rightArrowX = arrowPointX + (+unitY * 4); const rightArrowY = arrowPointY + (-unitX * 4); // 添加三角形 shape 表示箭头 group.addShape('path', { attrs: { path: [ ['M', arrowPointX, arrowPointY], ['L', leftArrowX, leftArrowY], ['L', rightArrowX, rightArrowY], ['Z'] ], fill: '#000' // 设置填充颜色 }, name: 'arrow-shape' }); return line; // 返回主要的 shape 对象 } }, 'single-edge'); // 继承的基础 edge 类型 ``` 上述代码展示了如何构建一个带箭头的自定义,并将其命名为 `'customArrow'`。其中的关键部分在于计算箭头的方向向量,并基于这些方向向量生成三个关键点来构成箭头形状[^3]。 #### 应用自定义到图表 一旦完成自定义的注册,在初始化图实例时即可直接应用它: ```javascript const data = { nodes: [{ id: 'node1', x: 100, y: 200 }, { id: 'node2', x: 300, y: 200 }], edges: [{ source: 'node1', target: 'node2', type: 'customArrow' // 使用刚才注册的 customArrow 类型 }] }; const graph = new G6.Graph({ container: 'mountNode', // DOM 容器 ID 或者 HTML 元素对象 width: 500, height: 500 }); graph.data(data); graph.render(); ``` 以上代码片段将之前定义好的 `'customArrow'` 应用于两个节点之间。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值