HTML5 canvas 2d library
dopa 的出现不是为了在现已存在的众多 canvas 2d 开发框架中独树一帜或特立独行,它并不为了增加心智负担而生。
dopa 相信每种以不同方式构思的框架或库的出现,都能够很好的解决其所面对的各种问题,而 dopa 仅以 让 canvas 2d 开发更简单 为出发点,单纯又小巧得约为 60KB。
dopa 以这样一种角度为追求:
- 最佳的性能表现和最少的内存占用,这使得它的渲染速度与原生代码几乎一致;
- 无损的灵活性,它所具备的能力与原生 canvas 基本对应并有关键的简化与增强;
- 直观的代码风格,通过阅读代码就知道发生了什么。
<script src="https://cdn.jsdelivr.net/npm/dopa"></script>
npm install dopa --save
dopa 的灵活性在初始化时的体现:
let layer = new dopa.Canvas({ // 新建画布 layer
container: '#app', // 通常是 div 容器的 '#id' 或引用
width: 300, // 手动指定画布的宽高
height: 200, // 如果不指定则适配容器宽高
pixelRatio: 1, // 如果不指定则适配高清屏
});
如果到这儿了觉得已经够了,那么:
let ctx = layer.context; // 直接接管绘图上下文
ctx.fillRect(50, 50, 100, 50); // 回到原生开发模式
原生 canvas 面向过程的开发:在 50, 50 坐标处,绘制一个宽 100,高 50 的矩形。
如果觉得这还不够,还有兴趣探索的话,那么有一种更好的方式:
let rect = layer.create('rect', { // 使用画布 layer 创建矩形
x: 150,
y: 100, // 设置矩形的坐标
width: 100,
height: 50 // 设置矩形的宽高
});
rect.fill(); // 矩形自身执行绘制
dopa 以图形为对象的开发:创建一个矩形,坐标 150, 100,宽 100,高 50,矩形执行绘制。
对比过程化地绘制一个矩形,虽然似乎写了一些额外代码,但是好处立马体现:
rect.fillStyle = 'orange'; // 单独设置矩形的填充样式
rect.rotation = Math.PI / 4; // 单独设置矩形的旋转角度
rect.fill(); // 矩形再次执行绘制
令人激动的是,创建的形状之间互不影响,持有各自独立的属性和公共的方法!
- dopa-corner:tholman/github-corners 的 dopa 实现
- dopa-stats:mrdoob/stats.js 的 dopa 实现
- dopa-benchmark:原生 API、ZRender 以及 Dopa 的渲染性能测试
- loading:Windows 系统更新动画
! 为常用内容,千里之行,始于此处; # 为不可见内容,表示私有、抽象,一般用不上; 其他为拓展内容,可用可忽视,层级结构表示继承。
工具对象,包含常用函数。
空函数,其值为 function () { return this; }
继承函数,使得 SubType
继承于 SuperType
且实现 ...Interface
。
继承基于原型链,将创建 SuperType.prototype
副本并赋值给 SubType.prototype
。
其中 ...Interface
类型为 PropertyDescriptorMap
对象,相当于 Object.defineProperties(SubType, PropertyDescriptorMap)
。
- SubType,子类构造函数
- SuperType,父类构造函数
- ...Interface,属性描述符对象
function SuperClass(name) {
this.name = name;
}
SuperClass.prototype.getName = function () {
return this.name;
};
function SubClass(name, age) {
SuperClass.call(this, name);
this.age = age;
}
dopa.util.extends(SubClass, SuperClass, {
getAge: {
value: function () {
return this.age;
}
}
});
let sub = new SubClass('dopa', 4);
console.log(sub.getName()); // output: dopa
console.log(sub.getAge()); // output: 4
measureText(text: string, font: string, align: string, baseline: string, direction: string): TextMetrics;
测量文本 text
处于 font
/align
/baseline
/direction
样式下的 TextMetrics
对象。
- text,待测量文本,如 'Hello Dopa'
- font,字体,如 '12px sans-serif'
- align,对齐方式,如 'center'
- baseline,基线,如 'middle'
- direction,方向,如 'ltr'
let metrics = dopa.util.measureText(
'Hello Dopa',
'12px sans-serif',
'center',
'middle',
'ltr'
);
console.log(metrics); // output: { ... }
测量文本 text
处于 font
字体下的宽度。
- text,待测量文本,如 'Hello Dopa'
- font,字体,如 '12px sans-serif'
let width = dopa.util.measureTextWidth('Hello Dopa', '12px san-serif');
console.log(width); // output: 64.552734375
loadImage(src: string, callback: (image: HTMLImageElement, success: boolean) => void, thisArg?: any): void;
从 src
地址加载一张图片,加载后会触发 callback
回调。
- src,图片路径,如 'https://mdn.mozillademos.org/files/1429/Canvas_earth.png'
- callback,加载成功或失败后触发的回调函数,回调图片对象以及是否成功加载
- thisArg,执行回调函数时的上下文对象
let src = 'https://mdn.mozillademos.org/files/1429/Canvas_earth.png';
dopa.util.loadImage(src, (image, success) => {
console.log(image, success);
});
创建线性渐变,与使用绘图上下文 context.createLinearGradient(x1, y1, x2, y2);
等效,此代码组织方式只是解耦了具体的绘图上下文 context
与渐变对象,以下几个函数同理。
- x1,线性渐变起始点 x
- y1,线性渐变起始点 y
- x2,线性渐变结束点 x
- y2,线性渐变结束点 y 2F47 ul>
- x1,径向渐变起始点 x
- y1,径向渐变起始点 y
- r1,径向渐变起始半径 radius
- x2,径向渐变结束点 x
- y2,径向渐变结束点 y
- r2,径向渐变结束半径 radius
- startAngle,锥形渐变起始角度,规范中定义 -PI / 2 为起始角度,chrome 中以 0 为起始角度
- x,锥形渐变中心点 x
- y,锥形渐变中心点 y
- image,作为重复图像的源对象
- repetition,指定如何重复图像,默认值 'repeat'
- number,将要标准化的数值
- range,目标值范围
- number,将要限制的数值
- min,目标数值的最小值
- max,目标数值的最大值
- value,将要判断的数值
- url,将要保存的 url,通常是 base64 字符串,如 canvas.toDataURL()
- filename,保存为的文件名
- start,整数,起点,若不存在 end,则起点为 0,终点为 start
- end,整数,终点
- containsEnd,结果值是否要包含终点
- start,插值起点
- end,插值终点
- ratio,插值进度,通常处于 0 ~ 1 之间
- linear(t: number): number;
- sinIn(t: number): number;
- sinOut(t: number): number;
- sinInOut(t: number): number;
- quadIn(t: number): number;
- quadOut(t: number): number;
- quadInOut(t: number): number;
- cubicIn(t: number): number;
- cubicOut(t: number): number;
- cubicInOut(t: number): number;
- quartIn(t: number): number;
- quartOut(t: number): number;
- quartInOut(t: number): number;
- quintIn(t: number): number;
- quintOut(t: number): number;
- quintInOut(t: number): number;
- expIn(t: number): number;
- expOut(t: number): number;
- expInOut(t: number): number;
- circleIn(t: number): number;
- circleOut(t: number): number;
- circleInOut(t: number): number;
- backIn(t: number): number;
- backOut(t: number): number;
- backInOut(t: number): number;
- elasticIn(t: number): number;
- elasticOut(t: number): number;
- elasticInOut(t: number): number;
- bounceIn(t: number): number;
- bounceOut(t: number): number;
- bounceInOut(t: number): number;
- bezier(x1, y1, x2, y2): Function (t: number): number;
- alpha,字符串,如 '0.5',将被解析为 127.5
- rgb,字符串,如 'rgb(127, 255, 64)'
- hex,字符串,如 '#7fff40'
- hsl,Hsl 对象
- lab,Lab 对象
- alpha,布尔值,表示是否包含 alpha 通道
- alpha,布尔值,表示是否包含 alpha 通道
- hsl,字符串,如 'hsl(30, 100%, 50%)'
- rgb,Rgb 对象
- alpha,布尔值,表示是否包含 alpha 通道
- lab,字符串,如 'lab(65, 45, 75)'
- rgb,Rgb 对象
- toEnd,布尔值,表示动画停止时是否直接执行到动画终点,仅对子动画 Animator 有效
- ratio,动画进度,值范围 (0, 1]
- timestamp,动画时间戳,值范围 (0, duration]
- interval,动画间隔时间,仅对主动画 Animation 有效
- forward,布尔值,动画方向
- animators,多个子动画对象
- animators,多个子动画对象
- width,宽度,不设置则默认适配容器宽度
- height,高度,不设置则默认适配容器高度
- immediate,布尔值,表示是否立即执行渲染不必等待下一帧
- x,清空起点 x,通常设为 0
- y,清空起点 y,通常设为 0
- width,清空区域宽度 width,通常设为画布宽度
- height,清空区域高度 height,通常设为画布高度
- type,类型,如 'render'/'click'
- listener,监听器函数
- Ctor,表示构造函数的字符串或构造函数,如 'rect' 等价于 dopa.Rect
- source | options: 如果是对象,则会浅拷贝给创建的对象,否则执行构造函数的 apply() 方法
- x,待设置的坐标 x
- y,带设置的坐标 y
- skewX,x 轴方向的错切度数,以弧度表示
- skewY,y 轴方向的错切度数,以弧度表示
- scaleX,x 轴方向的缩放倍数
- scaleY,y 轴方向的缩放倍数
- angle,旋转角度,以弧度表示
- x,x 轴方向的平移量
- y,y 轴方向的平移量
- a,矩阵数值 m11,或 {a, b, c, d, e, f} 矩阵对象
- b,矩阵数值 m12
- c,矩阵数值 m21
- d,矩阵数值 m22
- e,矩阵数值 m41
- f,矩阵数值 m42
- point,另一个点
- point,另一个点
- (x, y, width, height),获取区域中的 window.ImageData;
- (null, null, width, height),创建具备宽高的 window.ImageData;
- (x?, y?, imageData, null),将 imageData 赋值给对象;
- (x?, y?, imageData, width),将 imageData 以宽度复制,并赋值给对象;
- x,获取数据的起点坐标 x
- y,获取数据的起点坐标 y
- width_or_imageData,获取数据的宽度或 ImageData
- height_or_width,获取数据的高度或宽度,后者用于复制
- type,类型,默认为 PNG 格式,如 'image/png'
- quality,品质,默认为 0.92
- callback,回调函数,通常回调 Blob 对象
- type,类型,默认为 PNG 格式,如 'image/png'
- quality,品质,默认为 0.92
- x,点 x 坐标
- y,点 y 坐标
- x,点 x 坐标
- y,点 y 坐标
- callback,回调函数,回调供处理的 data、当前 index 及像素处于界面中的 x, y 坐标
- thisArg,执行回调函数时的上下文对象
- x,遍历起始坐标 x
- y,遍历起始坐标 y
- width,遍历宽度
- height,遍历高度
- size,马赛克的矩形大小,正整数,默认值 1,表示无效果
- x,遍历起始坐标 x
- y,遍历起始坐标 y
- width,遍历宽度
- height,遍历高度
- ratio,阈值,值范围 [0, 1],0 表示仅保留黑色,1 表示仅处理白色,默认值 1
- x,遍历起始坐标 x
- y,遍历起始坐标 y
- width,遍历宽度
- height,遍历高度
- x,遍历起始坐标 x
- y,遍历起始坐标 y
- width,遍历宽度
- height,遍历高度
- x,遍历起始坐标 x
- y,遍历起始坐标 y
- width,遍历宽度
- height,遍历高度
- threshold,阈值,值范围 [0, 1],默认值 127 / 255
- x,遍历起始坐标 x
- y,遍历起始坐标 y
- width,遍历宽度
- height,遍历高度
- size,毛玻璃随机像素的矩形大小,正整数,默认值 1,表示无效果
- movementX,x 轴方向拖曳距离
- movementY,y 轴方向拖曳距离
- zooming,缩放倍数
- x,缩放依据的 x 坐标
- y,缩放依据的 y 坐标
- fillRule,填充规则,默认值 'nonzero',可选 'evenodd'
- fillRule,填充规则,默认值 'nonzero',可选 'evenodd'
- count,恢复状态的次数。
- x,清空起点 x,以图形起始绘制点 startX 为基准
- y,清空起点 y,以图形起始绘制点 startY 为基准
- width,清空区域宽度 width
- height,清空区域高度 height
- fillRule,填充规则,默认值 'nonzero',可选 'evenodd'
- context,绘图上下文句柄
- startX,起始绘制点 x
- startY,起始绘制点 y
- ...,由 rebuildPath() 组建而来
- x1,线性渐变起始点 x,以图形起始绘制点 startX 为基准
- y1,线性渐变起始点 y,以图形起始绘制点 startY 为基准
- x2,线性渐变结束点 x,以图形起始绘制点 startX 为基准
- y2,线性渐变结束点 y,以图形起始绘制点 startY 为基准
- x1,径向渐变起始点 x,以图形起始绘制点 startX 为基准
- y1,径向渐变起始点 y,以图形起始绘制点 startY 为基准
- r1,径向渐变起始半径 radius
- x2,径向渐变结束点 x,以图形起始绘制点 startX 为基准
- y2,径向渐变结束点 y,以图形起始绘制点 startY 为基准
- r2,径向渐变结束半径 radius
- startAngle,锥形渐变起始角度,规范中定义 -PI / 2 为起始角度,chrome 中以 0 为起始角度
- x,锥形渐变中心点 x,以图形起始绘制点 startX 为基准
- y,锥形渐变中心点 y,以图形起始绘制点 startY 为基准
- success,表示图片是否成功加载
- repetition,指定如何重复图像,默认值 'repeat'
- 存在 0 个控制点,表现为线段
- 存在 1 个控制点,表现为二次贝塞尔曲线
- 存在 2 个控制点,表现为三次贝塞尔曲线
- path,可以是 svg path 字符串、Path2D 对象或 Path 对象。
- x,坐标 x
- y,坐标 y
- x,坐标 x
- y,坐标 y
- x1,朝向的控制点 1 坐标 x
- y1,朝向的控制点 1 坐标 y
- x2,圆弧朝向的控制点 2 坐标 x
- y2,圆弧朝向的控制点 2 坐标 y
- radius,圆弧半径
- cpx,控制点坐标 x
- cpy,控制点坐标 y
- x,结束点坐标 x
- y,结束点坐标 y
- cp1x,控制点 1 坐标 x
- cp1y,控制点 1 坐标 y
- cp2x,控制点 2 坐标 x
- cp2y,控制点 2 坐标 y
- x,结束点坐标 x
- y,结束点坐标 y
- x,矩形起始点坐标 x
- y,矩形起始点坐标 y
- w,矩形宽度
- h,矩形高度
- x,中心点坐标 x
- y,中心点坐标 y
- radius,半径
- startAngle,起始角度
- endAngle,结束角度
- anticlockwise,是否逆时针绘制
- x,中心点坐标 x
- y,中心点坐标 y
- radiusX,长轴半径
- radiusY,短轴半径
- rotation,旋转角度
- startAngle,起始角度
- endAngle,结束角度
- anticlockwise,是否逆时针绘制
- x,坐标 x
- y,坐标 y
- index,索引
- x,坐标 x
- y,坐标 y
- index,索引
- index,索引
- x,坐标 x
- y,坐标 y
- index,索引
- offset,偏移量
- startX,起始绘制点 x
- startY,起始绘制点 y
- points,原始数据点
- length,目标数据点长度
- built,构建的数据点
- ...,由 rebuildPoints() 组建而来
createRadialGradient(x1: number, y1: number, r1: number, x2: number, y2: number, r2: number): CanvasGradient;
创建径向渐变。
创建锥形(角向)渐变,目前多数浏览器尚未实现,如需在 chrome
中使用,需开启 chrome://flags/#new-canvas-2d-api
。
使用指定 image
以 repetition
方式,创建填充模式。
将一个数值 number
标准化到范围 range
中。
let normalize = dopa.util.normalizeNumber, PI = Math.PI;
console.log(normalize(-PI, PI * 2)); // output: PI
console.log(normalize(-PI / 2, PI * 2)); // output: PI * 3 / 2
console.log(normalize(PI / 2, PI * 2)); // output: PI / 2
console.log(normalize(PI * 3, PI * 2)); // output: PI
将一个数值 number
限制到范围 min
~ max
中。
let limit = dopa.util.limitNumber;
console.log(limit(5, 0, 10)); // output: 5
console.log(limit(-5, 0, 10)); // output: 0
console.log(limit(15, 0, 10)); // output: 10
判断数值 value
是否接近 0
,默认阈值取值为 Math.pow(2, -14)
。
let isNotZero = dopa.util.isNotAroundZero;
console.log(isNotZero(0)); // output: false
console.log(isNotZero(1e-5)); // output: false
console.log(isNotZero(1e-4)); // output: true
console.log(isNotZero(1)); // output: true
将 url
保存为本地文件。
随机一个整数。
let rand = dopa.util.randInt;
console.log(rand(5)); // output: 0/1/2/3/4
console.log(rand(3, 5)); // output: 3/4
console.log(rand(3, 5, true)); // output: 3/4/5
console.log(rand(-2, 2, true)); // output: -2/-1/0/1/2
插值函数,相当于 return start + (end - start) * ratio;
。
ease
为缓动函数对象。
ease
对象含有 31
个常见的动画缓动函数与 1
个贝塞尔缓动函数构造器,其中参数 t
为动画进度,值范围 [0, 1]。
let quad = dopa.ease.quadOut; // 动画先快后慢
for (let t = 0; t <= 1; t += 0.125) {
console.log(
'动画进度', t.toFixed(3),
'缓动进度', quad(t).toFixed(6)
);
}
透明度
透明度通道,值范围 [0, 255],默认值 0
解析 alpha
字符串为 Alpha
对象属性。
将 Alpha
对象转换成字符串。
三原色
红色,值范围 [0, 255],默认值 0
绿色,值范围 [0, 255],默认值 0
蓝色,值范围 [0, 255],默认值 0
解析 rgb
字符串为 Rgb
对象属性。
let rgb = new dopa.Rgb();
rgb.fromString('rgb(127, 255, 64)');
rgb.green = 0;
console.log(rgb.toString()); // output: rgb(127, 0, 64)
解析 hex
字符串为 Rgb
对象属性。
let rgb = new dopa.Rgb().fromHex('#7fff40');
解析 Hsl
对象为 Rgb
对象属性。
let rgb = new dopa.Rgb();
let hsl = new dopa.Hsl(30, 1, 0.5);
rgb.fromHsl(hsl);
console.log(rgb.toString()); // output: rgb(255, 128, 0)
解析 Lab
对象为 Rgb
对象属性。
let rgb = new dopa.Rgb();
let lab = new dopa.Lab(80, 10, -10);
rgb.fromLab(lab);
console.log(rgb.toString()); // output: rgb(211, 192, 217)
转换伽马编码 RGB
模式下的 Rgb
对象为线性光 sRGB
模式。
let rgb = new dopa.Rgb(127, 255, 64);
rgb.inverseCompanding();
console.log(rgb.red); // output: 0.21223...
console.log(rgb.green); // output: 1
console.log(rgb.blue); // output: 0.05126...
转换线性光 sRGB
模式下的 Rgb
对象为伽马编码 RGB
模式。
let rgb = new dopa.Rgb(0.2, 0.5, 0.8);
rgb.companding();
console.log(rgb.red); // output: 123.55494...
console.log(rgb.green); // output: 187.51603...
console.log(rgb.blue); // output: 231.11459...
将 Rgb
对象转换成 rgb
字符串。
let rgb = new dopa.Rgb(127, 255, 64, 127);
rgb.green -= 51;
console.log(rgb.toString()); // output: rgb(127, 204, 64)
console.log(rgb.toString(true)); // output: rgba(127, 204, 64, 0.49803...)
将 Rgb
对象转换成 hex
字符串。
let rgb = new dopa.Rgb(127, 255, 64, 127);
rgb.green -= 51;
console.log(rgb.toHex()); // output: #7fcc40
console.log(rgb.toHex(true)); // output: #7fcc407f
色彩空间
色相,值范围 [0, 360],默认值 0
饱和度,值范围 [0, 1],默认值 1
亮度,值范围 [0, 1],默认值 0.5
解析 hsl
字符串为 Hsl
对象属性。
let hsl = new dopa.Hsl();
hsl.fromString('hsl(30, 100%, 50%)');
hsl.lightness -= 0.2;
console.log(hsl.toString()); // output: hsl(30, 100%, 30%)
解析 Rgb
对象为 Hsl
对象属性。
let hsl = new dopa.Hsl();
let rgb = new dopa.Rgb(255, 128, 0);
hsl.fromRgb(rgb);
console.log(hsl.toString()); // output: hsl(30.11764..., 100%, 50%)
将 Hsl
对象转换成 hsl
字符串。
色彩空间
明度,值范围 [0, 100],默认值 0
位置,值范围 [-128, 127],默认值 0
位置,值范围 [-128, 127],默认值 0
解析 lab
字符串为 Lab
对象属性。
解析 Rgb
对象为 Lab
对象属性。
let lab = new dopa.Lab(); // 准备提亮一个颜色
let rgb = new dopa.Rgb(255, 128, 0); // 橙色
lab.fromRgb(rgb); // 转换成 Lab
lab.lightness += 10; // 提亮明度
rgb.fromLab(lab); // 转换回 Rgb
console.log(rgb + ''); // output: rgb(255, 155, 43)
将 Lab
对象转换成字符串。
私有、抽象的动画基类
动画持续时长,不设置则默认为一个极小值,在下一帧直接执行完毕。
动画帧间隔时长,不设置则默认为 0,表示以最高帧率运行。
启动动画。
恢复动画。
暂停动画。
停止动画。
判断动画是否正在运行。
判断动画是否处于停止状态。
判断动画是否处于暂停状态。
动画 start()
启动时触发此回调。
动画 resume()
恢复时触发此回调。
动画 运行
时触发此回调。
动画 pause()
暂停时触发此回调。
动画 stop()
停止时触发此回调。
动画 结束
时触发此回调。
主动画循环
添加子动画对象。
移除子动画对象。
画布(图层)
container
可以是容器 '#id'
或 {container, width, height, pixelRatio, duration, interval}
配置对象。
只读属性容器 container
,在初始化时指定,值为 wrapper.parentNode
。
只读属性包装容器 wrapper
,一般初始化时自动生成,可实现重叠多张画布。
只读属性画布 canvas
,呈现内容的载体。
只读属性绘图上下文 context
,绘制内容的句柄。
宽度,不设置则自动适配容器 container
的宽度。
高度,不设置则自动适配容器 container
的高度。
像素比例,不设置则自动适配设备像素比例 devicePixelRatio
。
只读属性 visible
表示 canvas
是否可见。
鼠标样式,不设置则默认为 ''
。
调整大小的方法,单独调整此 Canvas
大小一次,通常用于超过界面大小的截图。此方法也会由 ResizeObserver
触发。
执行渲染的方法,如果具备 duration
,则会启动动画。
清空画布的方法。
销毁 Canvas
的方法。
添加事件监听器的方法,可添加 WindowEventMap
中的多数监听器以及 内置回调
的监听器。
使用 new
操作符创建一个以 Ctor
作为构造函数的对象并添加给 Canvas
。
Canvas
对象创建时触发此回调。
Canvas
对象创建时以及容器 container
大小变动后触发此回调。
Canvas
对象创建时以及动画运行时触发此回调。
Canvas
对象显示在视窗中、移出视窗时、浏览器显示及隐藏时触发此回调。
Canvas
对象执行 destroy
销毁时触发此回调。
子动画循环
主动画句柄,子动画依赖于主动画才能运行,主动画可添加多个子动画同时运行互不干扰。
反转动画。
动画 reverse()
反转时触发此回调。
点
坐标 x
,默认值 0
。
坐标 y
,默认值 0
。
同时设置 x, y
坐标。
错切(斜切)坐标。
缩放坐标。
旋转坐标。
平移坐标。
transform(a: number | DOMMatrix2DInit, b?: number, c?: number, d?: number, e?: number, f?: number): this;
变换坐标。
缩放成单位长度 1
,可视为处理成单位向量。
反转坐标。
顺时针旋转 90
度。
加,可视为向量相加。通常用来平移对象。
减,可视为向量相减。
window.ImageData
的包装器,对 devicePixelRatio
敏感。
ImageData(x, y, width_or_imageData, height_or_width, dirtyX, dirtyY, dirtyWidth, dirtyHeight) extends Point;
脏矩形起始点 x,默认值 undefined
。
脏矩形起始点 y,默认值 undefined
。
脏矩形宽度 width,默认值 undefined
。
脏矩形高度 height,默认值 undefined
。
内部数据源 imageData
。
只读属性宽度。
只读属性高度。
只读属性左侧边界。
只读属性上侧边界。
只读属性右侧边界。
只读属性下侧边界。
getImageData(x?: number, y?: number, width_or_imageData: number | ImageData, height_or_width?: number): this;
获取 window.ImageData
数据,方法因参数不同,有以下 4
种执行方式:
将 ImageData
对象转换成 DataURL
字符串。
将 ImageData
对象转换成 Blob
对象,完成后以 callback
回调。
填充绘制。
判断点 x, y
是否处于 ImageData
内部。
获取点 x, y
位于 ImageData.data
里的 index
值。
forEach(callback: (data, index, x, y) => void, thisArg?: any, x?: number, y?: number, width?: number, height?: number): this;
遍历 ImageData.data
。
马赛克处理 ImageData
。
transparencyDisposal(threshold?: number, x?: number, y?: number, width?: number, height?: number): this;
透明度处理,将阈值 threshold
之上像素点的 alpha
通道设置为 0
。
反转颜色。
灰度处理。
黑白二值化。
浮雕滤镜。
墨镜滤镜。
毛玻璃滤镜。
组,可作为其他组或形状的父级。
需要注意的是,区别于点的变形方法是改变点的坐标 x, y
,组的变形是依据 originX, originY
而改变的组本身的缩放、旋转及错切。
变形依据的原点 x 坐标,默认值 0
。
变形依据的原点 y 坐标,默认值 0
。
设置组的父级 group
,父对象的变形和样式均会影响子对象。
x 轴方向的缩放倍数。
y 轴方向的缩放倍数。
x 轴方向的错切度数,以弧度表示。
y 轴方向的错切度数,以弧度表示。
旋转角度,以弧度表示。
矩阵数值 m11。
矩阵数值 m12。
矩阵数值 m21。
矩阵数值 m22。
矩阵数值 m41。
矩阵数值 m42。
透明度,值范围 [0, 1],0
表示透明,1
表示不透明,默认值 1
。
图形合成运算方式,默认值 'source-over'
。
CSS 滤镜,默认值 'none'
。
阴影模糊,默认值 0
。
阴影颜色,默认值 'rgba(0, 0, 0, 0)'
。
阴影 x 轴偏移量,默认值 0
。
阴影 y 轴偏移量,默认值 0
。
填充样式,默认值 '#000000'
。
描边样式,默认值 '#000000'
。
虚线样式,默认值 []
。
虚线偏移量,默认值 0
。
线宽,默认值 1
。
线段两端样式,默认值 'butt'
。
线段连接处样式,默认值 'miter'
。
线段连接处长度限制值,默认值 10
。
是否开启图像平滑,默认值 true
。
图像平滑质量,默认值 'low'
。
文字字体,默认值 '10px sans-serif'
。
文字对齐方式,默认值 'start'
。
文字基线类型,默认值 'alphabetic'
。
文字方向,默认值 'ltr'
。
拖曳组的方法。
缩放组的方法。
更新组的变形,绘制时自动调用,手动调用以获取矩阵数值。
更新组的通用样式,绘制时自动调用,手动调用以获取通用样式。
更新组的填充样式,填充绘制时自动调用,手动调用以获取填充样式。
更新组的描边样式,描边绘制时自动调用,手动调用以获取描边样式。
更新组的图像样式,绘制图片时自动调用,手动调用以获取图像样式。
更新组的文字样式,绘制文字时自动调用,手动调用以获取文字样式。
图形(形状),具备绘制能力,也是所有图形的父类。
绘图上下文句柄。
图形起始绘制点 x 坐标,默认值 0
。
图形起始绘制点 y 坐标,默认值 0
。
填充绘制。
描边绘制。
裁剪绘制的范围,此时会向栈中推入一次状态快照。
恢复裁剪操作,此时栈会推出状态快照并恢复。
图形执行裁剪方法,接着执行清空矩形区域的方法,最后执行恢复裁剪方法。
图形统一组建参数,重建路径的方法。通常由子类覆写,自动执行,使得 buildPath()
与对象解耦。
图形具体进行绘制的方法。通常由子类覆写,由 rebuildPath()
触发调用。
判断点 x, y
是否处于图形内部。
判断点 x, y
是否处于图形描边处。
快速判断点 x, y
是否处于图形内部。此方法通常为粗略的判断,未实现的图形则回退为 isPointInPath
。
快速判断点 x, y
是否处于图形描边处。此方法通常为粗略的判断,未实现的图形则回退为 isPointInStroke
。
创建线性渐变,以图形起始绘制点为基准。
createRadialGradient(x1: number, y1: number, r1: number, x2: number, y2: number, r2: number): CanvasGradient;
创建径向渐变,以图形起始绘制点为基准。
创建锥形(角向)渐变,以图形起始绘制点为基准,目前多数浏览器尚未实现,如需在 chrome
中使用,需开启 chrome://flags/#new-canvas-2d-api
。。
矩形
矩形宽度,默认值 undefined
。
矩形高度,默认值 undefined
。
只读属性左侧边界。
只读属性上侧边界。
只读属性右侧边界。
只读属性下侧边界。
网格
网格间距,正整数,默认值 1
。
圆角矩形
圆角半径,非负数,默认值 0
。
图像,window.Image
的包装器
Image(startX, startY, src_or_image, originX, originY, width, height, cropX, cropY, cropWidth, cropHeight) extends Rect;
裁切起始点 x,默认值 undefined
。
裁切起始点 y,默认值 undefined
。
裁切宽度,默认值 undefined
。
裁切高度,默认值 undefined
。
图片来源字符串,如 url
地址或 base64
字符串。
内部图像源 image
,属于 CanvasImageSource
的对象均可。
只读属性 complete
,表示 Image
是否加载完成。
图片加载成功或失败后触发的回调。
转换图片为 window.ImageData
。
使用当前内部图像源 image
以 repetition
方式,创建填充模式。
波浪形
Wave(startX, startY, width, height, amplitude, method, period, phase, step, originX, originY) extends Rect;
振幅,默认值 10
。
周期函数,默认值 Math.sin
。
周期,默认值 Math.PI * 2
。
初始相位,默认值 0
。
步进,正整数,默认值 1
。
文字
文本字符串,默认值 ''
。
文本最大宽度,默认值 undefined
。
let text = layer.create('text', {
x: 100,
y: 100,
text: 'Hello Dopa',
font: '12px sans-serif'
});
text.fill();
console.log(text.width); // output: 64.55273...
console.log(text.font); // output: 12px sans-serif
text.width = 100;
text.y += 50;
text.fill();
console.log(text.width); // output: 96.82910...
console.log(text.font) // output: 18px sans-serif
只读属性文本宽度。
只读属性 metrics
,获取文本处于当前文字样式下的 TextMetrics
对象。
只读属性文本包围盒宽度。
只读属性文本包围盒高度。
只读属性左侧边界。
只读属性上侧边界。
只读属性右侧边界。
只读属性下侧边界。
圆弧
圆弧半径,默认值 0
。
起始角度,默认值 0
。
结束角度,默认值 Math.PI * 2
。
是否逆时针绘制圆弧,默认值 false
。
只读属性圆心坐标 x。
只读属性圆心坐标 y。
扇形
圆环
Ring(startX, startY, outerRadius, innerRadius, startAngle, endAngle, anticlockwise, originX, originY) extends Arc;
外圆半径,等价于属性 radius
。
内圆半径,默认值 0
。
椭圆
Ellipse(startX, startY, radiusX, radiusY, startAngle, endAngle, anticlockwise, originX, originY) extends Arc;
椭圆长轴半径,等价于属性 radius
。
椭圆短轴半径,默认值 0
。
正多边形
外接圆半径,默认值 0
。
边数,默认值 3
。
只读属性圆心坐标 x。
只读属性圆心坐标 y。
正多角形
科赫雪花分形
线段
结束点坐标 x,默认值 0
。
结束点坐标 y,默认值 0
。
只读属性长度。
只读属性角度。
连接线。使用 3
个点生成一段圆弧或线段。
控制点坐标 x,默认值 undefined
。
控制点坐标 y,默认值 undefined
。
只读属性起始角度,在绘制或 rebuildPath()
之后才会产生此值。
只读属性结束角度,在绘制或 rebuildPath()
之后才会产生此值。
贝塞尔曲线。有以下 3
种表现形式:
Curve(startX, startY, endX, endY, controlX1, controlY1, controlX2, controlY2, originX, originY) extends Link;
控制点 1
的坐标 x,等价于属性 controlX
。
控制点 1
的坐标 y,等价于属性 controlY
。
控制点 2
的坐标 x。
控制点 2
的坐标 y。
只读属性起始角度。
只读属性结束角度。
只读属性中段角度。
等腰三角形。使用顶角垂线长度与顶角角度来定义。
顶角垂线长度,默认值 10
。
顶角角度,默认值 Math.PI / 3
。
水滴形
心形
大头针形
window.Path2D
的包装器路径
内部路径数据。
添加路径的方法。
移动画笔。
绘制连线。
依据两个控制点绘制圆弧。
绘制二次贝塞尔曲线。
绘制三阶贝塞尔曲线。
绘制矩形。
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): this;
绘制圆弧。
绘制椭圆。
闭合路径。
以原始数据点来驱动的图形
原始数据点的一维列表,默认值 []
。
目标数据点的长度,默认值 0
。
构建的数据点列表,由 buildPoints
构建而来。
目标数据点列表,由构建的数据点 built
经过矩阵变换而来。
添加一组数据点 x, y
。
在索引 index
处插入一组数据点 x, y
。
删除索引 index
处的一组数据点。
更新索引 index
处的一组数据点。
查看索引 index
处,偏移量 offset
处的坐标值。
清空所有数据点。
PolyShape
统一组建参数,重建数据点的方法。通常由子类覆写,自动执行,使得 buildPoints()
与对象解耦。
PolyShape
具体构建数据点的方法。通常由子类覆写,由 rebuildPath()
触发调用。
私有、抽象的类折线段
折线段
多阶贝塞尔曲线
贝塞尔曲线升阶,新增一组控制点并保持曲线的形状。
私有、抽象的类多边形
多边形
矩形
只读属性宽度。
只读属性高度。
只读属性左侧边界。
只读属性上侧边界。
只读属性右侧边界。
只读属性下侧边界。
圆形
只读属性半径。
只读属性圆心坐标 x。
只读属性圆心坐标 y。
超椭圆
超椭圆公式中的幂值,默认值 3
。
平滑曲线
张力,默认值 1
。
事件订阅
注册类型为 type
的 listener
事件监听器。
移除类型为 type
的 listener
事件监听器。
触发类型为 type
的事件,以 event
为事件对象,若 event
非原始数据类型,会被赋予 stop()
方法的能力,用于停止事件分发。
首次注册 type
事件时的回调。
最终移除 type
事件时的回调。