【前端学习】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.registerEdge('custom-polyline',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值