A canvas library which providing 2d draw for G2.
npm i @antv/g
$ git clone git@github.com:antvis/g.git
$ npm install
$ npm run dev
var canvas = new Canvas({
containerId: 'c1',
width: 500,
height: 600
});
var group = canvas.addGroup();
var shape = group.addShape('circle', {
attrs: {
x: 100,
y: 100,
r: 50,
fill: 'red'
}
});
canvas.draw();
shape.attr({
x: 200,
y: 200
});
canvas.draw();
G 作为 G2、G6 的绘图引擎,主要包括的类:
- Canvas 绘图引擎的入口
- Group 图形分组,可以包含图形和分组
- Shape 图形属性
- Element Group 和 Shape 的基类
- width 画布宽度
- height 画布高度
- containerId 容器 id
- pixelRatio 画布大小和所占 DOM 宽高的比例,一般可以使用 window.devicePixelRatio
- children 所有的子元素(分组或者图形)只读属性
var canvas = new Canvas({
containerId: 'c1',
width: 500,
height: 600
});
-
get(name) 获取属性
-
set(name, value) 设置属性
-
draw 绘制方法
-
addShape(type, cfg) 添加图形,支持的图形类型见 Shape
canvas.addShape('circle', { zIndex: 5, attrs: { x: 10, y: 10, r: 50 } });
-
addGroup([GroupClass], cfg) 添加分组
var group = canvas.addGroup(); // 添加分组 var group1 = canvas.addGroup(AGroup, { // 属性 });
-
getPointByClient(clientX, clientY) 根据窗口的位置获取画布上的位置信息
-
changeSize(w,h) 改变大小
-
sort() 对内部图形元素进行排序,根据图形元素的 zIndex 进行排序
-
clear() 清空画布
-
destroy() 销毁
-
on(eventType, callback) 绑定事件,支持浏览器的常见事件:click, dblclick, mouseenter, mouseleave, mouseover, mouseup, mousedown, touchstart, touchend
-
off(eventType, callback) 解除绑定
图形分组可以嵌套图形和分组
- zIndex 层次索引值,决定分组在父容器中的位置
- visible 是否可见
- children 嵌套的图形元素,只读
-
get(name) 获取属性
-
set(name, value) 设置属性
-
setSilent(name, value) 由于 set 方法进行一些检测,会执行一些方法,所以可以使用这个方法提升函数性能
-
addShape(type, cfg) 添加图形, 支持的图形类型见 Shape
group.addShape('circle', { zIndex: 5, attrs: { x: 10, y: 10, r: 50 } });
-
addGroup([GroupClass], cfg) 添加分组
var g1 = group.addGroup(); // 添加分组 var g2 = group.addGroup(AGroup, { // 属性 });
-
getBBox() 获取包含的所有图形的包围盒
-
show() 显示
-
hide() 隐藏
-
remove() 从父容器中移除当前分组
-
sort() 对内部图形元素进行排序,根据图形元素的 zIndex 进行排序
-
clear() 清空画布
-
destroy() 销毁
-
find(fn) 在当前group中递归查找满足fn的shape或group
-
findAll(fn) 在当前group中递归查找所有满足fn的shape和group
-
findById(id) 在当前group中递归查找id匹配的shape或group
-
findBy(fn) 接口已废弃
-
find(id) 接口已废弃
支持的所有图形的基类,支持的所有通用的属性和方法
- zIndex 层次索引值,决定分组在父容器中的位置
- visible 是否可见
- attrs 图形属性,通用的图形属性如下:
- transform 进行几何变换的矩阵
- 通用的图形属性,见绘图属性
-
attr('name', [value]) 设置、获取图形属性
circle.attr({ // 同时设置多个属性 x: 100, y: 100, fill: '#fff' }); circle.attr('fill', 'red'); // 设置单个属性 circle.attr('fill'); // 获取属性
-
animate(attrs, duration, easing, callback, delay = 0) 执行动画
- attrs 所有的图形属性
- duration 执行的时间 ms
- easing 参加 d3-ease
- callback 执行完毕后的回调函数
- delay 延迟执行
-
getBBox() 获取图形的包围盒
-
show() 显示
-
hide() 隐藏
-
remove() 从父容器中移除当前图形
-
destroy() 销毁
圆,一般在添加图形时使用 'circle' 来标识, type = 'circle'
- 通用的图形属性见:绘图属性
- x 圆心坐标的x坐标
- y 圆心坐标的y坐标
- r 圆的半径
canvas.addShape('circle', {
attrs: {
x: 150,
y: 150,
r: 70,
stroke: 'black'
}
});
canvas.addShape('circle', {
attrs: {
x: 100,
y: 100,
r: 60,
lineDash: [20, 20],
stroke: 'red'
}
});
canvas.addShape('circle', {
attrs: {
x: 100,
y: 100,
r: 100,
fill: 'rgba(129,9,39,0.5)',
stroke: 'blue'
}
});
canvas.draw();
绘制矩形,type = 'rect'
- 通用的图形属性见:绘图属性
- x 起始点 x 坐标
- y 起始点 y 坐标
- width 宽度
- height 高度
- radius 圆角: 支持整数或数组形式, 分别对应左上、右上、右下、左下角的半径。
- radius缩写为 1或 [ 1 ] 相当于 [ 1, 1, 1, 1 ]
- radius 缩写为 [ 1, 2 ] 相当于 [ 1, 2, 1, 2 ]
- radius 缩写为 [ 1, 2, 3 ] 相当于 [ 1, 2, 3, 2 ]
canvas.addShape('rect', {
attrs: {
x: 150,
y: 150,
width: 150,
height: 150,
stroke: 'black',
radius: 2
}
});
canvas.addShape('rect', {
attrs: {
x: 150-50,
y: 150-50,
width: 150,
height: 150,
stroke: 'red'
}
});
canvas.addShape('rect', {
attrs: {
x: 150+50,
y: 150+50,
width: 150,
height: 150,
fill: 'rgba(129,9,39,0.5)',
stroke: 'blue'
}
});
绘制的路径 ,使用 'path' 来标识, type = 'path'
-
通用的图形属性见:绘图属性
-
path:路径,支持 字符串或者数组两种方式,详情参考 svg path
-
arrow 箭头设置
- true / false: 显示 / 取消默认箭头
- 支持定义箭头样式,箭头中心位于(0, 0)点,箭头指向与x轴正方向相同
- path: 箭头样式
- d: path方向上箭头的位移
canvas.addShape('path', { attrs: { startArrow: { path: 'M 10,0 L -10,-10 L -10,10 Z', d: 10 } } });
const path = group.addShape('path', { attrs: { path: 'M100,600' + 'l 50,-25' + 'a25,25 -30 0,1 50,-25' + 'l 50,-25' + 'a25,50 -30 0,1 50,-25' + 'l 50,-25' + 'a25,75 -30 0,1 50,-25' + 'l 50,-25' + 'a25,100 -30 0,1 50,-25' + 'l 50,-25' + 'l 0, 200,' + 'z', lineWidth: 10, lineJoin: 'round', stroke: '#54BECC' } }); const path1 = group.addShape('path', { attrs: { path: [['M', 100, 100], ['L', 200, 200]], stroke: 'red', lineWidth: 2 } });
绘制直线, type = 'line',可以使用 path 来代替,
- 通用的图形属性见:绘图属性
- x1 起始点的 x 坐标
- y1 起始点的 y 坐标
- x2 结束点的 x 坐标
- y2 结束点的 y 坐标
- arrow 箭头设置
- true / false: 显示 / 取消默认箭头
- 支持定义Marker形状的箭头,箭头中心位于线段的端点
canvas.addShape('line', { attrs: { startArrow: new Marker({ attrs: { ... } }) } });
canvas.addShape('line', {
attrs: {
x1: 20,
y1: 20,
x2: 280,
y2: 280,
stroke: 'red' // 颜色名字
}
});
canvas.addShape('line', {
attrs: {
x1: 20,
y1: 300 + 20,
x2: 280,
y2: 300 + 280,
startArrow: true,
endArrow: true, // 显示箭头
stroke: '#00ff00' // 6位十六进制
}
});
canvas.addShape('line', {
attrs: {
x2: 300 + 20,
y2: 300 + 20,
x1: 300 + 280,
y1: 300 + 280,
startArrow: true,
endArrow: true, // 显示箭头
stroke: '#00f' // 3位十六进制
}
});
canvas.addShape('line', {
attrs: {
x1: 20,
y1: 600 + 20,
x2: 280,
y2: 600 + 280,
lineDash: [10,10],
stroke: 'rgb(100, 100, 200)' // rgb数字模式
}
});
多个点的折线,type = 'polyline'
- 通用的图形属性见:绘图属性
- points 包含的点集合
canvas.addShape('polyline', {
attrs: {
points: [[741.6487813219777,1183.92131359719],[583.1709046233477,33.93352498571885],[1098.3455104904451,246.13363066051957],[211.30437444177633,420.3306748934016],[980.3732054245157,756.2252762234709],[374.28495603818607,108.15975006182006],[422.7940564389682,1119.2144105552136],[833.5078092462321,586.7198136138784]],
stroke: 'red'
}
});
绘制图片,type = 'image'
- x 起始点 x 坐标
- y 起始点 y 坐标
- width 宽度
- height 高度
- img 图片的路径、canvas 对象、图片对象
canvas.addShape('image', {
attrs: {
x: 150+200,
y: 150,
img: 'https://zos.alipayobjects.com/rmsportal/FDWrsEmamcNvtEf.png'
}
});
canvas.addShape('image', {
attrs: {
x: 150-50,
y: 150-50,
img: 'https://zos.alipayobjects.com/rmsportal/nAVchPnSaAWncPj.png'
}
});
canvas.addShape('image', {
attrs: {
x: 150+50,
y: 150+150,
img: 'https://zos.alipayobjects.com/rmsportal/GHGrgIDTVMCaYZT.png'
}
});
文本,type = 'text'
- 通用的图形属性见:绘图属性
- x 文字的位置坐标 x
- y 文字的位置坐标 y
- font 设置文本内容的当前字体属性,这个属性可以分解成多个属性单独配置:
- fontStyle 对应 font-style;
- fontVariant 对应 font-variant;
- fontWeight 对应 font-weight;
- fontSize 对应 font-size;
- fontFamily 对应 font-family;
- textAlign 设置文本内容的当前对齐方式, 支持的属性:center|end|left|right|start;
- textBaseline 设置在绘制文本时使用的当前文本基线, 支持的属性:top|middle|bottom。
注意
:文本的颜色一般使用 fill 属性,而非 'stroke' 属性
canvas.addShape('text', {
attrs: {
x: 150,
y: 150,
fontFamily: 'PingFang SC',
text: '文本文本',
fontSize: 90,
stroke: 'black'
}
});
canvas.addShape('text', {
attrs: {
x: 150+100,
y: 250,
fontFamily: 'PingFang SC',
fontSize: 90,
text: '字体',
lineDash: [10, 10],
stroke: 'red'
}
});
canvas.addShape('text', {
attrs: {
x: 150+50,
y: 150+150,
text: '对齐方式',
fontFamily: 'Hiragino Sans GB',
fontSize: 100,
textAlign: 'center',
textBaseline: 'top',
fill: 'rgba(129,9,39,0.5)',
stroke: 'blue'
}
});
G 还提供了几个特殊的 Shape
- marker 绘制小的几何 icon
- fan 绘制圆饼
- arc 圆弧
- ellipse 椭圆
- cubic 三阶贝塞尔曲线
- quadratic 二阶贝塞尔曲线
这些图形都可以使用 path 代替,所以在这里不详细介绍了