【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

news2024/11/24 11:43:28

【课程链接】

AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili

本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解)

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>06 深入图形与图形分组、自定义节点、节点动画</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>
		G6.registerNode('lineNode', {
			// 复写draw方法
			draw: (cfg, group) => {
				const keyShape = group.addShape('circle', {
					attrs: {
						r: 70,
						x: 0,
						y: 0,
						opacity: 0
					}
				});

				// 画5条虚线做极坐标的对齐线
				const rGap = 10;
				let currentR = 30;
				for (let i = 0; i < 5; i++) {
					group.addShape('circle', {
						attrs: {
							r: currentR,
							x: 0,
							y: 0,
							lineWidth: 1,
							stroke: '#bae7ff',
							lineDash: [5, 5]
						}
					})
					currentR += rGap;
				}
				// 中心的圆点和文本
				group.addShape('circle', {
					attrs: {
						fill: cfg.centerColor,
						x: 0,
						y: 0,
						r: 20
					}
				})
				group.addShape('text', {
					attrs: {
						text: cfg.label,
						fill: '#111',
						x: 0,
						y: 0,
						textAlign: 'center',
						textBaseline: 'middle',
						fontWeight: 500
					},
					// 给text一个name,为动画animate检索做准备
					name: 'line-chart-label'
				});

				// 绘制折线和它们的坐标点
				const alphaGap = Math.PI * 2 / 25;
				let pointCount = 0;
				cfg.details.forEach(detail => {
					const { color, values } = detail;
					const positions = []
					values.forEach(value => {
						const r = value + 20;
						const alpha = alphaGap * pointCount;
						pointCount++;
						const x = r * Math.cos(alpha);
						const y = r * Math.sin(alpha);
						const point = group.addShape('circle', {
							attrs: {
								fill: color,
								x,
								y,
								r: 2,
							},
							// 给圆点起名字name,为圆点添加hover效果做准备
							name: 'line-chart-point'
						})

						positions.push({ x, y });
					});
					// 绘制各个detail数据的路径
					group.addShape('path', {
						attrs: {
							path: positions.map((pos, i) => [i === 0 ? 'M' : 'L', pos.x, pos.y]),
							stroke: color,
							lineWidth: 1
						}
					})
				})
				return keyShape;
			},
			// 中间文本不断缩放的动画
			afterDraw: (cfg, group) => {
				const textShape = group.find(ele => ele.get('name') === 'line-chart-label')
				const rate = 1.01;
				// 动画的另一种写法,onFrame,onFrame的参数ratio是一次动画执行的比例
				textShape.animate(ratio => {
					const currentFontSize = textShape.attr('fontSize') || 12;
					const scale = ratio < 0.5 ? rate : (1 / rate);
					const targetFontSize = currentFontSize * scale;

					// console.log('ratio', ratio);	0 < ratio < 1	 			
					// console.log('currentFontSize', currentFontSize);		 			
					// console.log('scale', scale);		 

					return { fontSize: targetFontSize }
				}, {
					duration: 1000,
					repeat: true
				})
			}

		}, 'circle');

		const width = document.getElementById('container').scrollWidth
		const height = document.getElementById('container').scrollHeight || 500
		const graph = new G6.Graph({
			container: 'container',
			width,
			height,
			fitCenter: true,
			defaultNode: {
				type: 'lineNode'
			}
		})

		const data = {
			nodes: [
				{
					id: 'node1',
					label: 'Node1',
					x: 150,
					y: 150,
					centerColor: "#bae7ff", // 中心圆形的颜色
					details: [
						{ cat: 'pv', values: [20, 30, 40, 30, 30], color: '#5B8FF9' },
						{ cat: 'dal', values: [40, 30, 20, 30, 50], color: '#5AD8A6' },
						{ cat: 'uv', values: [40, 30, 30, 40, 40], color: '#5D7092' },
						{ cat: 'sal', values: [20, 30, 50, 20, 20], color: '#F6BD16' },
						{ cat: 'cal', values: [10, 10, 20, 20, 20], color: '#E8684A' },
					],
				},
				{
					id: 'node2',
					label: 'Node2',
					x: 400,
					y: 150,
					centerColor: "#5b8ff9",
					details: [
						{ cat: 'pv', values: [10, 10, 50, 20, 10], color: '#5B8FF9' },
						{ cat: 'dal', values: [20, 30, 10, 50, 40], color: '#5AD8A6' },
						{ cat: 'uv', values: [10, 50, 30, 20, 30], color: '#5D7092' },
						{ cat: 'sal', values: [50, 30, 20, 20, 20], color: '#F6BD16' },
						{ cat: 'cal', values: [50, 10, 20, 50, 30], color: '#E8684A' },
					],
				},
			],
			edges: [
				{
					source: 'node1',
					target: 'node2',
				},
			]
		}




		graph.data(data);
		graph.render();

		// 为数据的圆点添加hover后变大的动画
		graph.on('line-chart-point:mouseenter', e => {
			const { target } = e
			target.animate(
				{ r: 5 },
				{ duration: 100, repeat: false }
			)
		})
		graph.on('line-chart-point:mouseleave', e => {
			const { target } = e
			target.animate(
				{ r: 2 },
				{ duration: 100, repeat: false }
			)
		})
		// 为数据的圆点添加hover后变大的动画 END

		if (typeof window !== 'undefined')
			window.onresize = () => {
				if (!graph || graph.get('destroyed')) return;
				if (!container || !container.scrollWidth || !container.scrollHeight)
					graph.changeSize(container.scrollWidth, container.scrollHeight);
			}
	</script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

长芯微国产LS0104电平转换器/电平移位器P2P替代TXS0104

LS0104这个4位非反相转换器是一个双向电压电平转换器&#xff0c;可用于建立数字混合电压系统之间的切换兼容性。它使用两个单独的可配置电源轨支持1.65V至5.5V工作电压的端口同时它跟踪VCCA电源和支持的B端口工作电压从2.3V到5.5V&#xff0c;同时跟踪VCCB供应。这允许更低和更…

【C++】stackqueuedeque

目录 一、stack&#xff1a; 1、栈的介绍&#xff1a; 2、栈的使用&#xff1a; 3、栈的成员函数的模拟实现&#xff1a; 二、queue: 1、队列的介绍&#xff1a; 2、队列的使用&#xff1a; 3、队列的模拟实现&#xff1a; 三、deque&#xff1a; deque的底层结构&am…

电脑丢失msvcp120.dll问题原因及详细介绍msvcp120.dll丢失的解决方法

在使用 Windows 操作系统时&#xff0c;你可能会遇到一个常见的错误提示&#xff1a;“程序无法启动&#xff0c;因为计算机中丢失 msvcp120.dll”。这个错误通常意味着你的系统中缺少了一个重要的动态链接库文件&#xff0c;即msvcp120.dll。这个文件是 Microsoft Visual C 20…

一文读懂SpringMVC的工作原理

前言 MVC是经典的软件架构设计模式&#xff0c;几乎在各个领域各种开发语言中&#xff0c;均采纳了这个思想。此刻博主突然想到了Thinking in xxx系列设计书籍。换句话说&#xff0c;就是“各人自扫门前雪”和“术业有专攻”。当职责分配得当后&#xff0c;剩下的就是发挥各“…

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件&#xff0c;然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它&#xff0c;快速获取到想要知道的信息。https://www.chatpdf.com/

全志A527 A133 A523 T527 T133 H6 H8应用无法开启后台服务

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1 代码修改方法14.2 代码修改方法24.3 代码修改方法35.彩蛋1.前言 像全志的很多平台,普通的app并不能正常的启动后台的服务,这样对于应用层很困扰,无法启动后台的服务,功能就不能正常使用…

2024最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

新160个crackme - 052-tc.2

运行分析 提示选择Keyfile&#xff0c;选择后弹出错误的Keyfile&#xff0c;需要先破解Keyfile还需要破解Name和Serial PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到Keyfile关键字符串&#xff0c;双击进入 ida动态调试&#xff0c;找到关…

moment() 时间

指定日期月初/月末 moment(自定义时间) 当月月初&#xff08;假设当月8月&#xff09;2024-08-01 00:00:00 moment().startOf(“month”).format(“YYYY-MM-DD HH:mm:ss”) 当月月末 2024-08-31 23:59:59 moment().endOf(“month”).format(“YYYY-MM-DD HH:mm:ss”) 加法 ad…

【小项目】python贪吃蛇小游戏设计

引入pygame库 添加pygame库&#xff0c;在cmd中输入以下代码&#xff0c;进行安装。如果输入pip install pygame出现以下报错&#xff0c;可以尝试在前面加入python3 -m。 python3 -m pip install pygame 贪吃蛇代码 import pygame import time import random# 初始化 Pygam…

使用yolov8识别+深度相机+机械臂实现垃圾分拣机械臂(代码分享)

文章目录 垃圾分拣机械臂视频演示程序主代码完整代码链接 垃圾分拣机械臂 视频演示 点击查看 使用YoloV8做的目标检测&#xff0c;机械臂手眼标定使用Aruco的方式&#xff0c;通过深度相机获取三维坐标&#xff0c;与机械臂坐标系之间的转化&#xff0c;得到抓取的坐标深度相…

猜数游戏-Rust 入门经典案例

文章目录 发现宝藏1. 项目概述2. 项目结构3. 实现游戏4. 依赖管理5. 测试6. 改进和扩展7. 总结 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 在这篇博客中&#xff0c;我们将…

网站钓鱼——挂马技术手段介绍

更多网安实战内容&#xff0c;可前往无问社区查看http://wwlib.cn/index.php/artread/artid/10194.html 网站挂马目前已经成为流氓软件以及红队人员快速获取目标主机权限的常用手段之一&#xff0c;在长时间的实战中也是出现了层出不穷的钓鱼方法&#xff0c;这次分享一下实际…

酒茶香链接心灵——探寻现代人幸福生活

科技在飞速发展&#xff0c;人类社会以前所未有的速度向前跃进&#xff0c;物质世界的繁荣达到了前所未有的高度。 然而&#xff0c;这光鲜的背后&#xff0c;却无形中拉远了人与人之间的距离&#xff0c;割裂了传统文化的根脉。 传统文化势弱、“快餐文化”层出不穷&#xff0…

synchronized锁升级及CAS和AQS简述

概述 为什么会有锁升级的步骤呢&#xff0c;假设没有这个步骤&#xff0c;多个线程竞争时&#xff0c;抢到锁的线程直接运行&#xff0c;其他的都直接sleep/wait&#xff0c;然后等第一个线程运行完成后&#xff0c;再由操作系统唤醒接下来的线程。这个一套动作下来就很费调度…

【学习笔记】SSL密码套件之密钥交换

本篇将介绍密钥交换常用的协议&#xff0c;分别是ECDHE&#xff0c;DHE&#xff0c;ECDH&#xff0c;DH&#xff0c;RSA&#xff0c;PSK 密钥交换的目的&#xff1a;建立种子值&#xff08;Seed Value&#xff09; 种子值&#xff08;二进制数字&#xff09;用于生成额外的对称…

Python Opencv: 基于颜色提取的印章分割

利用Python实现了一个图像处理功能&#xff0c;即批量提取图像中的印章区域&#xff1b;使用了颜色聚类的方法来提取颜色。 本代码也发布到了github&#xff0c;欢迎大家试用&#xff08;如果帮助&#xff0c;请star一下&#xff09;&#xff1a; GitHub - AICVHub/seal_seg_o…

讯鹏PDA扫码机一维/二维条码扫描轻松应对各种应用场景

在数字化系统集成中&#xff0c;选择合适的PDA手持机至关重要。然而&#xff0c;市场上许多PDA手持机存在扫码不灵敏精度差、屏幕小、系统卡、可靠性弱、易损坏等问题&#xff0c;给用户带来诸多困扰。针对这些痛点&#xff0c;讯鹏推出了一款5.72寸全面屏手持扫码PDA&#xff…

Unity6 + UE5.4 PSO缓存实践记录

题图&#xff08;取自COD冷战的着色器编译提示&#xff09; PSO&#xff08;管线状态对象 Pipeline State Object&#xff09;是伴随现代图形API&#xff08;DirectX12、Vulkan、Metal&#xff09;而出现的概念&#xff0c;它本质上是单次绘制时渲染管线所处的状态信息的集合&…

滁州皖东农商银行新任董事长未得官宣,年报涉嫌泄露股东隐私

撰稿|芋圆 近期&#xff0c;滁州皖东农商银行发布2024年半年报&#xff0c;其2024年上半年营业收入4.7亿元&#xff0c;同比增长72%&#xff0c;成功实现扭亏为盈&#xff1b;净利润1.37亿元&#xff0c;同比上涨10%&#xff0c;增速显著提升。但其利息净收入1.4亿元&#xff…