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
英文地址,請注明出處:http://en.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;…