AntV G 入门教程

下面是 AntV G(以下简称 G)的中文入门与核心 API 教程,涵盖从画布创建、图形绘制到事件与动画等常用方法,每个 API 均附带完整示例代码。示例引用自官方“Getting Started”指南 ([g.antv.antgroup.com][1])。


一、安装与引入

# 使用 npm(或 yarn / pnpm 同理)
npm install @antv/g --save
// 在项目中引入 G 的核心模块
import { Canvas, Group, Rect, Circle, Line, Polygon, Path, Text, Image, Matrix } from '@antv/g';

二、创建 Canvas

2.1 构造函数

new Canvas({container: 'containerId', // 容器的 DOM id 或 HTMLElementwidth:  800,              // 画布宽度,默认为容器宽度height: 600,              // 画布高度pixelRatio: window.devicePixelRatio, // 设备像素比background: '#fff',       // 背景色
});

2.2 示例

<!-- HTML -->
<div id="container" style="width:800px; height:600px;"></div>
// JavaScript
const canvas = new Canvas({container: 'container',width: 800,height: 600,background: '#f5f5f5',
});

三、绘制基础图形

G 提供了一系列 Shape 类,你可以直接 appendChild 到 Canvas 或者 Group 上。

3.1 矩形 Rect

const rect = new Rect({style: {x: 50,y: 50,width: 200,height: 100,fill: '#5B8FF9',stroke: '#3B76FF',lineWidth: 2,radius: 8,            // 圆角opacity: 0.85,},
});
canvas.appendChild(rect);

3.2 圆形 Circle

const circle = new Circle({style: {x: 400,y: 100,r: 50,fill: '#61DDAA',stroke: '#3BAE9A',lineWidth: 3,},
});
canvas.appendChild(circle);

3.3 直线 Line

const line = new Line({style: {x1: 50, y1: 200,x2: 300, y2: 200,stroke: '#F6BD16',lineWidth: 4,lineDash: [10, 5],},
});
canvas.appendChild(line);

3.4 多边形 Polygon

const polygon = new Polygon({style: {points: [[400, 200],[450, 260],[420, 340],[360, 340],[330, 260],],fill: '#FAD400',stroke: '#D4A200',lineWidth: 2,},
});
canvas.appendChild(polygon);

3.5 路径 Path

const path = new Path({style: {path: [['M', 100, 400],['C', 150, 350, 250, 450, 300, 400],['L', 300, 500],['Z'],],fill: '#FF4D4F',},
});
canvas.appendChild(path);

3.6 文本 Text

const text = new Text({style: {x: 400,y: 400,text: 'Hello, G!',fill: '#262626',fontSize: 24,textAlign: 'center',textBaseline: 'middle',},
});
canvas.appendChild(text);

3.7 图片 Image

const img = new Image({style: {x: 500,y: 300,width: 100,height: 100,img: 'https://example.com/logo.png',},
});
canvas.appendChild(img);

四、使用 Group 分组

const group = new Group();
canvas.appendChild(group);// 将多个图形加入同一个组,方便统一变换或事件绑定
group.appendChild(new Rect({style: { x: 50, y: 520, width: 150, height: 60, fill: '#9254DE' },
}));
group.appendChild(new Text({style: { x: 125, y: 550, text: '分组示例', fill: '#fff', textAlign: 'center' },
}));

五、坐标变换与 Matrix

5.1 变换方法(针对单个元素)

// 平移
rect.translate(100, 50);
// 旋转(角度制)
circle.rotate((Math.PI / 180) * 45, 400, 100);
// 缩放(相对于元素自身坐标原点)
polygon.scale(1.5, 1.5, 400, 260);

5.2 矩阵工具

// 获取元素当前的变换矩阵
const m = line.getComputedMatrix(); // [a, b, c, d, e, f]// 矩阵相乘
const m2 = Matrix.multiply(m, [1, 0, 0, 1, 20, 20]);// 将客户端(页面)坐标转为画布坐标
const pt = canvas.getPointByClient(100, 100);

六、事件系统

G 的事件模型兼容 DOM API,可在 Canvas、Group 或单个 Shape 上注册。

// 在元素上监听
rect.on('mouseenter', () => {rect.attr('opacity', 1);
});
rect.on('mouseleave', () => {rect.attr('opacity', 0.8);
});
rect.on('click', (ev) => {console.log('点击坐标:', ev.clientX, ev.clientY);
});// 在画布上监听所有“点位”事件
canvas.on('pointerdown', (ev) => {console.log('按下:', ev.target.get('id'));
});

七、动画 API

// 为单个属性创建动画
circle.animate([{ r: 50 }, { r: 80 }, { r: 50 }],{duration: 2000,iterations: Infinity,easing: 'easeCubicInOut',}
);// 停止动画
circle.stopAnimate();

八、交互示例:拖拽

// 给元素启用拖拽
rect.on('pointerdown', (ev) => {canvas.setCursor('move');const start = { x: ev.x, y: ev.y };const origin = { x: rect.attr('x'), y: rect.attr('y') };const move = (moveEvt) => {const dx = moveEvt.x - start.x;const dy = moveEvt.y - start.y;rect.attr({ x: origin.x + dx, y: origin.y + dy });};const up = () => {canvas.setCursor('default');canvas.off('pointermove', move);canvas.off('pointerup', up);};canvas.on('pointermove', move);canvas.on('pointerup', up);
});

九、导出与销毁

// 将画布导出为 DataURL
const dataURL = canvas.toDataURL('image/png', { backgroundColor: '#fff' });// 清空所有元素
canvas.clear();// 销毁 Canvas,释放资源
canvas.destroy();

十、小结

  1. 核心类CanvasGroup、各种 ShapeRectCirclePathText 等)。
  2. 绘图流程:创建 Canvas → appendChild Shape/Group → 调用属性与方法 → 渲染自动完成。
  3. 坐标与变换translaterotatescaleMatrix 工具。
  4. 事件与交互:兼容 DOM 事件模型,支持自定义拖拽、缩放等行为。
  5. 动画element.animate(keyframes, options) 简洁强大。
  6. 导出销毁toDataURLcleardestroy 方便画布管理。

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

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

相关文章

短视频矩阵什么意思?

短视频矩阵是指通过布局多个短视频账号&#xff0c;形成协同运营的账号体系&#xff0c;以实现流量聚合、品牌曝光或商业变现的策略。其核心逻辑是利用不同账号的定位、内容风格或受众群体&#xff0c;构建互补的流量网络&#xff0c;而非单一账号的独立运营。 核心特点与作用&…

Linux 日志查看和分析

Linux 日志是系统运行状态的重要记录&#xff0c;包含了系统启动、服务运行、用户操作、安全事件等关键信息&#xff0c;对于故障排查、安全审计和系统维护至关重要。 故障排查&#xff1a;定位系统崩溃、服务异常的根本原因&#xff08;如服务启动失败、硬件故障&#xff09;…

一篇文章快速学会HTML

一篇文章快速学会HTML 注&#xff1a;适合有一定编程基础的来快速掌握HTML 超文本标记语言 超文本&#xff1a;文本&#xff0c;声音&#xff0c;图片&#xff0c;视频&#xff0c;表格&#xff0c;链接 标记&#xff1a;许多的标签组成 HTML页面是运行到浏览器上的 HTML…

智能混合检索DeepSearch

智能混合检索 DeepSearch 是一款自主研发的大规模分布式搜索引擎&#xff0c;提供一站式智能搜索解决方案。系统内置多种行业专属的查询语义理解能力&#xff0c;融合语义 ORC 模型、文本向量模型、图像/视频向量模型、大语言模型&#xff08;LLM&#xff09;、分词器以及机器学…

【Docker基础】Docker镜像管理:docker tag详解

目录 1 Docker镜像标签基础概念 1.1 什么是Docker镜像标签 1.2 镜像标识的三要素 2 docker tag命令详解 2.1 命令基本语法 2.2 命令工作原理 2.3 常用操作示例 3 标签管理的实践示例 3.1 标签命名规范 3.2 多标签策略 3.3 latest标签的合理使用 4 标签与镜像仓库的…

AI时代个人IP的重塑与机遇 | 创客匠人

2025年作为AI应用爆发元年&#xff0c;正悄然改写个人IP的打造逻辑。AI不会取代IP&#xff0c;却会淘汰不懂得与AI共生的创作者。 AI重构IP运营的三大机遇 内容生产效率提升&#xff1a;传统模式下需2-3天打磨的深度文章&#xff0c;AI输入关键词后半小时即可完成初稿&#xf…

[5-03-01].第14节:集群搭建 - 在Linux系统中搭建

SpringCloud学习大纲 三、集群环境搭建&#xff1a; 3.1.集群规划 1.nacos规划&#xff1a; hadoop103hadoop104hadoop105192.168.148.3192.168.148.4192.168.148.5nacosnacosnacos 2.MYSQL规划 &#xff1a;192.168.148.3 3306 5.7.27

ESP32-CH3+MicroPython+INMP441 测试麦克风通过音量阈值控制小灯

测试功能描述&#xff1a; 程序会先测量 2 秒环境音量作为基准&#xff0c;然后开始实时显示音量柱状图&#xff0c;并在 30 秒后自动结束&#xff0c;当检测到音量超过阈值时会显示提示并打开led灯 一&#xff0c;硬件准备&#xff1a; 1.ESP32 CH3 USB开发板1块 2.INMP44…

io.net 携手 Walrus,为 AI 和机器学习应用提供去中心化存储与计算能力

作为最大规模的按需云计算提供商之一&#xff0c;io.net 部署并管理来自地理分布式节点的去中心化 GPU 集群&#xff0c;现正与基于 Sui 构建的去中心化数据存储协议 Walrus 深度整合。此次合作为去中心化 AI 和机器学习&#xff08;machine learning&#xff0c;ML&#xff09…

【上市公司文本分析】根据句号和分号进行文本分割,提取含有特定关键词的语句并导出为EXCEL

本文介绍了一种基于Python的中文文本分析方法&#xff0c;用于从年报文件中提取含有关键词的语句。方法使用jieba分词库进行中文分词&#xff0c;通过自定义词典提高分词准确性。程序首先读取并预处理文本&#xff08;统一标点符号、去除换行符&#xff09;&#xff0c;然后按句…

小白畅通Linux之旅-----DHCP服务项目实战

目录 一、项目拓扑 二、项目要求 三、项目准备 DHCP服务器 1、下载dhcp服务 2、准备 1.txt 文件 &#xff08;为内部客户机设置为固定获得ip&#xff09; 3、准备2.txt文件 &#xff08;为内部网络分配ip&#xff09; 4、准备 3.txt 文件&#xff08;为外部网络配置ip&…

eps转pdf-2025年6月18日星期三

1.打开cmd。 使用 cd 命令切换到包含 EPS 文件的目录。例如&#xff0c;如果 EPS 文件在 E:\eps_files 目录下&#xff0c;输入以下命令&#xff1a; cd E:\eps_files 2. 转换单个 EPS 文件&#xff1a; 输入以下命令将单个 EPS 文件转换为 PDF 文件 epstopdf input.eps …

处理器特性有哪些?

处理器特性有哪些&#xff1f; 处理器的特性可以从多个维度进行划分&#xff0c;包括架构设计、性能指标、功能支持等。以下是处理器的主要特性分类及详细说明&#xff1a; 1. 架构特性 指令集架构&#xff08;ISA&#xff09; CISC&#xff08;复杂指令集&#xff0c;如x86&…

Vue3+TypeScript 导入枚举(Enum)最佳实践

在 Vue 3 TypeScript 项目中&#xff0c;导入枚举时通常不需要使用 import type&#xff0c;但具体取决于使用场景。以下是详细说明&#xff1a; 1. 枚举的特殊性 枚举在 TypeScript 中既是类型&#xff08;Type&#xff09;也是值&#xff08;Value&#xff09;&#xff1a…

主成分分析(PCA)例题——给定协方差矩阵

向量 x x x的相关矩阵为 R x [ 0.3 0.1 0.1 0.1 0.3 − 0.1 0.1 − 0.1 0.3 ] {\bm R}_x \begin{bmatrix} 0.3 & 0.1 & 0.1 \\ 0.1 & 0.3 & -0.1 \\ 0.1 & -0.1 & 0.3 \end{bmatrix} Rx​ ​0.30.10.1​0.10.3−0.1​0.1−0.10.3​ ​ 计算输入向量…

RTSP播放器低延迟实践:一次对毫秒级响应的技术探索

✅ 为什么说“大牛直播SDK的RTSP播放器延迟表现行业领先”&#xff1a; 1. 毫秒级延迟&#xff08;100ms~250ms&#xff09; windows平台rtsp播放器延迟测试 在业内常见的 RTSP 播放器中&#xff0c;传统开源方案&#xff08;如 VLC、FFmpeg 播放器封装&#xff09;延迟普遍在…

【postgresql中timestamp为6是什么意思?】

postgresql中timestamp为6是什么意思&#xff1f; postgresql中timestamp为6是什么意思&#xff1f;示例注意事项 postgresql中timestamp为6是什么意思&#xff1f; 在 PostgreSQL 中&#xff0c;TIMESTAMP 类型用于存储日期和时间信息。当你提到 TIMESTAMP(6)&#xff0c;这里…

EC2实例(Amazon Linux 2023)监控磁盘读写速度和I/O负载

在viewer端进行日志分析的时候&#xff0c;由于日志比较大&#xff0c;每个4.5G&#xff0c;一共9个viewer端&#xff0c;对应9个日志文件&#xff0c;而且判断音频帧和视频帧是否卡顿时&#xff0c;需要的样本也很多&#xff0c;各15000行&#xff0c;分析完成需要5分20秒左右…

SpringBoot电脑商城项目--收获地址列表

1. 收获地址列表展示-持久层 1.1 sql语句 1.2 AddressMapper接口编写抽象方法 /*** 根据用户id查询用户的收货地址数据* param uid* return*/List<Address> findByUid(Integer uid); 1.3 在xml文件中进行sql映射 <!-- DESC降序 --><select id"fin…

学校住宿缴费系统h5-——东方仙盟——仙盟创梦IDE

代码: <div class"form-group"><h4 style"color: #006400; margin-bottom: 15px;">费用明细 <input name"room_unit_price" id"room_unit_price" type"number" value"" style"width:65px;…