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

本文主要是介绍【前端学习】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>

这篇关于【前端学习】AntV G6-07 深入图形与图形分组、自定义节点、节点动画(上、中)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Vue中插槽slot的使用示例详解

《Vue中插槽slot的使用示例详解》:本文主要介绍Vue中插槽slot的使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、插槽是什么二、插槽分类2.1 匿名插槽2.2 具名插槽2.3 作用域插槽三、插槽的基本使用3.1 匿名插槽

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

CSS3 布局样式及其应用举例

《CSS3布局样式及其应用举例》CSS3的布局特性为前端开发者提供了无限可能,无论是Flexbox的一维布局还是Grid的二维布局,它们都能够帮助开发者以更清晰、简洁的方式实现复杂的网页布局,本文给... 目录深入探讨 css3 布局样式及其应用引言一、CSS布局的历史与发展1.1 早期布局的局限性1.2

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选