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

课程链接

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

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


图形分组 Group | G6 (antgroup.com)

自定义元素 G6.registerX | G6 (antgroup.com)

图形样式属性 Shape Attr | G6 (antgroup.com)


通过G6.registerNode方法,绘制基于 rect 的自定义卡片,并且提到:

1. 如果要更新自定义node,需要注意重绘时 update方法 是否要重写,有2个方法可以解决

2. 更新节点时候需要注意位置变形的问题,通过设置相对的x,y解决

3. KeyShape的draggable属性,可以控制是否这部分可以被拖拽

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>05 深入图形与图形分组、自定义节点、节点动画</title><!-- 引入 G6 --><script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script>
</head><body><div id="container"></div><script>const ICON_MAP = {a: 'https://ts2.cn.mm.bing.net/th?id=ODLS.70f7e605-0e03-4ed5-8935-b48cb3ee855f&w=32&h=32&o=6&pid=AdsPlus',b: 'https://ts2.cn.mm.bing.net/th?id=OADD2.7353136438133_1J11L5COSQ5ZDZ3TDJ&w=32&h=32&o=6&pid=21.2'}const data = {nodes: [{id: 'node2',title: 'node2',error: false,nodeType: 'a',nodeLevel: 0,panels: [{ title: '成功率', value: '11%' },{ title: '耗时', value: '50s' },{ title: '错误数', value: '12' },],x: 100,y: 100},{id: 'node3',title: 'node3',error: true,nodeType: 'b',nodeLevel: 0,panels: [{ title: '成功率', value: '19%' },{ title: '耗时', value: '10s' },{ title: '错误数', value: '8' },],x: 100,y: 200},],}// 第1个参数,卡片节点的名字// 第2个参数,options// 第3个参数,继承的节点类型G6.registerNode('card-node', {// 复写 draw 方法// 第1个参数,这个节点的配置// 第2个参数,这个节点的图形分组,现在的目的是往这个图形分组中去增加图形draw: (cfg, group) => {const color = cfg.error ? '#F4664A' : '#30BF78';const x = -200 / 2;const y = -60 / 2;const keyShape = group.addShape('rect', {attrs: {x,y,width: 200,height: 60,stroke: color,fill: '#fff',radius: 2},name: 'card-node-keyshape'});const titleRect = group.addShape('rect', {attrs: {x,y,width: 200,height: 20,stroke: color,fill: color,radius: 2},name: 'card-node-title-back',draggable: true  // G6为keyShape添加了draggable属性,为true时这部分图形才可以被拖拽});const image = group.addShape('image', {attrs: {x: x + 2,y: y + 2,width: 14,height: 14,img: ICON_MAP[cfg.nodeType],cursor: 'pointer'}});const title = group.addShape('text', {attrs: {text: cfg.title,x: x + 30,y: y + 4,fill: '#fff',textBaseline: 'top'},name: 'card-node-title'});let panelX = - x + 40;  // 疑问点:视频里这里不需要负号const subGroup = group.addGroup();cfg.panels?.forEach((panel, i) => {const panelTitle = subGroup.addShape('text', {attrs: {text: panel.title,x: x + panelX,y: y + 38,fill: '#ccc',textAlign: 'center'},name: `card-node-panel-title-${i}`})subGroup.addShape('text', {attrs: {text: panel.value,x: x + panelX,y: y + 54,fill: '#111',textAlign: 'center'},name: `card-node-panel-title-${i}`})// 根据前面图形的大小来放置后面的图形const titleBBox = panelTitle.getBBox();// console.log(titleBBox);panelX = titleBBox.maxX + 40;// panelX += 60;})return keyShape;},// update: undefined// 如果重写了update方法,渲染层面就会走这个update方法,而不会清空整个节点去重新绘制update: (cfg, item) => {const group = item.getContainer(); // 获取图形容器const titleShape = group.find(ele => ele.get('name') === 'card-node-title') // 通过name属性找到需要更新的图形// titleShape.attr('text', cfg.title); // 更新title里的text字段,attr 用来更新某个绘图属性// 批量更新titleShape.attr({text: cfg.title,// ... 其他属性})}}, 'rect')// 如果要更新node,方法1:取消继承自 rect// 如果要更新node,方法2:在继承自 rect 的前提下,设置update方法为undefined,重绘时就会走自定义的drawconst width = document.getElementById('container').scrollWidthconst height = document.getElementById('container').scrollHeight || 500const graph = new G6.Graph({container: 'container',width,height,fitCenter: true,// fitView: true,// 模式modes: {// 拖拽画布 drag-canvas// 拖拽节点 drag-node // 缩放画布 zoom-canvasdefault: ['drag-canvas', 'drag-node'],},defaultNode: {type: 'card-node'}})graph.data(data);graph.render();graph.updateItem(graph.getNodes()[0], {// 如果要更新node,方法1:取消继承自 rect// 如果要更新node,方法2:在继承自 rect 的前提下,设置update方法为undefined,重绘时就会走自定义的drawtitle: 'new-title~~'})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.rhkb.cn/news/416716.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S 发布应用

前言 昨儿个用 unbuntu20.04 又装了一次K8S 用的 kubeadm containerd Cilium (CNI) 又重新撸了一遍 这里只记录 应用发布的笔记 正文 #创建deployment kubectl create deployment nginx --imagenginx #我这边大约30秒后显示为 ready kubectl get deployments kubectl desc…

MySQL - 基础 - 概述

基础 - 概述 一、相关概念 1、数据库&#xff08;DB&#xff09; 存储数据的仓库&#xff0c;数据是有组织的进行存储 2、数据库管理系统&#xff08;DBMS&#xff09; 操纵和管理数据库的大型软件 3、SQL 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库…

【设计模式】工厂模式与策略模式的区别

目录 1、工厂模式 2、策略模式 3、区别 3.1、工厂模式 1. 目的&#xff1a; 2. 使用场景&#xff1a; 3. 实现方式&#xff1a; 4. 示例&#xff1a; 3.2、策略模式 1. 目的&#xff1a; 2. 使用场景&#xff1a; 3. 实现方式&#xff1a; 4. 示例&#xff1a; 工…

权威解读|2024固定网国内数据传送业务办理指南

一、固定网国内数据传送业务是什么&#xff1f; 固定网国内数据传送业务&#xff0c;是指互联网数据传送业务以外的&#xff0c;在固定网中以有线方式提供的国内端到端数据传送业务。主要包括基于IP承载网、ATM网、X.25分组交换网、DDN网、帧中继网络的数据传送业务等。 根据…

数据库管理-第238期 23ai:全球分布式数据库-架构与组件(20240904)

数据库管理238期 2024-09-04 数据库管理-第238期 23ai&#xff1a;全球分布式数据库-架构与组件&#xff08;20240904&#xff09;1 架构图2 分片数据库与分片3 Shard Catalog4 Shard Director5 Global Service6 管理界面总结 数据库管理-第238期 23ai&#xff1a;全球分布式数…

地理围栏,打造智能生活新边界

随着智能手机和其他移动设备的普及&#xff0c;用户对基于位置获取个性化服务的需求大幅增加&#xff0c;例如用户进入商圈范围并停留操作一段时间后&#xff0c;智能触发向用户推送该商圈吃、喝、玩、乐的优惠活动消息&#xff1b;又如当用户到达非常驻地的机场时触发围栏&…

工业网关在汽车智能工厂中的应用-天拓四方

工业网关是工业物联网&#xff08;IIoT&#xff09;的关键组成部分&#xff0c;它充当了工业现场设备与云端或企业级系统之间的桥梁。在智能工厂中&#xff0c;工业网关的应用至关重要&#xff0c;它确保了生产线的顺畅运行&#xff0c;并通过数据的透明化&#xff0c;提升了生…

《高等代数》范德蒙德行列式的应用

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;范德蒙德行列式的简单应用及其变形。 范德蒙德行列式的计算公式&#xff1a; 注&#xff1a;&#xff08;1&#xff09;用大下标减去小下标。 &#xff08;2&#xf…

QFile打开文件的两种方式

一、UI界面设置两个按键&#xff0c;并直接转到槽函数 二、两种代码展示 #include <QFile> #include <QDebug>//此两种方式中调用函数&#xff0c;应包含的头文件void Widget::on_btnReadFile01_clicked()//第一种打开方式 {//1. 打开文件QFile file;file.setFile…

密钥加密机的定义与功能

密钥加密机是信息安全领域中的核心设备&#xff0c;通过密码学原理&#xff0c;利用加密算法和密钥管理技术&#xff0c;对通信内容进行加密保护&#xff0c;确保数据在传输过程中的机密性、完整性和真实性。以下是对密钥加密机的详细阐述&#xff1a; 一、定义与功能 定义&…

集成电路学习:什么是OLED有机发光二极管

一、OLED&#xff1a;有机发光二极管 OLED&#xff0c;全称有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;是一种电流型的有机发光器件。以下是关于OLED的详细介绍&#xff1a; 二、OLED的定义与原理 OLED是基于有机半导体材料和发光材料在…

【游戏安全】CheatEngine基础使用——如何对不同类型的数值进行搜索?如何破解数值加密找到想修改的数值?

游戏安全 不同数值类型的搜索破解简单数值加密 不同数值类型的搜索 可以在游戏中看到很精确的物品数量&#xff0c;但是在CE中却什么都扫不到。 这是因为他的数值类型可能并不是四字节的&#xff0c;在游戏中这个数值的机制是一个慢慢增长的数值&#xff0c;所以他很有可能是…

信息安全威胁

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;我国面临的信息安全威胁 从受威胁的对象来看&#xff0c;可以将我国面临的信息安全威胁分为三类&#xff1a;国家威胁、组织威胁和个人威胁。 来自国家的威胁&#xff1a; 恐怖组…

Hive服务部署及Datagrip工具使用

目录 Hive服务部署 Hiveserver2服务 1&#xff09;用户说明 2&#xff09;Hiveserver2部署 &#xff08;1&#xff09;Hadoop端配置 &#xff08;2&#xff09;Hive端配置 3&#xff09;测试 &#xff08;1&#xff09;启动Hiveserver2 &#xff08;2&#xff09;使用命…

计算机工具软件安装攻略:Visual Studio Code下载、安装和使用

Visual Studio Code下载、安装和使用 1 Visual Studio Code简介 Visual Studio Code通常简称为VS Code&#xff0c;是一款由微软开发的免费、开源的轻量级代码编辑器。它在开发者社区中非常受欢迎&#xff0c;具有强大的功能和扩展性&#xff0c;适用于多种编程语言和开发场景…

激光器原理--材料篇

半导体材参杂 https://zhuanlan.zhihu.com/p/24683205 能带跃迁&#xff0c;能量变化&#xff0c;从电变为光。 Si半导体是间隙带隙&#xff0c; 三五族是直接带隙。直接带隙方便跃迁&#xff0c;容易出光

Verilog基础,原码,反码与补码的概念

Verilog模块初认识 1、Verilog模块(Module) Verilog中的module可以看成一个具有输入输出端口的黑盒子&#xff0c;该黑盒子有输入和输出接口(信号)&#xff0c;通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数) 图1 模块示意图 1.1 模块描述 图1 所示的…

el-table利用折叠面板 type=“expand“ 嵌套el-table,并实现 明细数据多选,选中明细数据后返回原数据得嵌套格式

效果图: 废话不多说直接上代码&#xff0c;完整代码展示&#xff1a; <template><el-tableborderref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"><el-table-columnwidth"50"la…

简单的Linux Ftp服务搭建

简单的Linux FTP服务搭建 1.需求 公司有一个esb文件传输代理&#xff0c;其中我们程序有文件传输功能&#xff0c;需要将本地文件传输到esb文件代理服务器上&#xff0c;传输成功之后发送http请求&#xff0c;告知esb将固定文件进行传输到对应外围其他服务的文件目录中&#…

[环境配置]Pycharm手动安装汉化插件

在Pycharm-file-setting-Plugins中&#xff0c;搜索chinese&#xff0c;就会出现汉化包 点击install后&#xff0c;在安装时出现这种报错&#xff1a;Plugin "Chinese (Simplified) Language Pack / 中文语言包" was not installed: Invalid filename returned by a …