Canvas

Canvas

Canvas 是一个组件,实现了部分 CanvasRenderingContext2D 接口,可以用于通过脚本绘制图形。

注意:

  • 过多的属性赋值操作(例如 canvas.lineWidth = 10)或绘制操作(例如 canvas.stroke())可能会导致系统性能下降。
  • 用户可以清空整个画布以擦除之前的属性赋值或绘图操作。

Constructor

new Canvas()

初始化一个新的 Canvas 实例

Examples

清空整个画布:

canvas.clearRect(0, 0, canvas.width, canvas.height);

绘制一座房子:

var canvas = new Canvas();
this.widget.add(canvas);

// 设置线宽
canvas.lineWidth = 10;

// 墙体
canvas.strokeRect(75, 140, 150, 110);

// 门
canvas.fillRect(130, 190, 40, 60);

// 屋顶
canvas.beginPath();
canvas.moveTo(50, 140);
canvas.lineTo(150, 60);
canvas.lineTo(250, 140);
canvas.closePath();
canvas.stroke();

Extends

Members

fillStyle :color|gradient

See:

设置或返回用于填充绘图的颜色或渐变。

Type:
  • color | gradient

font :font

See:

设置或返回文本内容的当前字体属性。

Type:
  • font

globalAlpha :Number

See:

设置或返回当前绘图的透明度(alpha 值)。

Type:
  • Number

globalCompositeOperation :String

See:

设置或返回新图像如何绘制到已有图像上。

Type:
  • String

height :Number

Overrides:

此属性表示组件的高度。

Type:
  • Number

lineCap :String

See:

设置或返回线条末端的样式。

Type:
  • String

lineDashOffset :Number

See:

设置或返回虚线偏移量。

Type:
  • Number

lineJoin :String

See:

设置或返回两条线相交时创建的拐角类型。

Type:
  • String

lineWidth :Number

See:

设置或返回当前的线宽。

Type:
  • Number

miterLimit :Number

See:

设置或返回最大斜接长度。

Type:
  • Number

opacity :Number

Overrides:

此属性表示组件的不透明度。 不透明度的有效范围为 1.0(完全不透明)到 0.0(完全透明)。

Type:
  • Number

rotation :Number

Overrides:

此属性表示组件顺时针旋转的角度(单位:度)。

Type:
  • Number

strokeStyle :color|gradient

See:

设置或返回用于描边的颜色或渐变。

Type:
  • color | gradient

textAlign :String

See:

设置或返回文本内容的当前对齐方式。

Type:
  • String

textBaseline :String

See:

设置或返回绘制文本时使用的当前文本基线。

Type:
  • String

width :Number

Overrides:

此属性表示组件的宽度。

Type:
  • Number

x :Number

Overrides:

此属性表示组件相对于其父级的 x 坐标。

Type:
  • Number

y :Number

Overrides:

此属性表示组件相对于其父级的 y 坐标。

Type:
  • Number

Methods

arc(x, y, radius, startAngle, endAngle, anticlockwiseopt)

See:

创建一个弧/曲线(用于绘制圆或圆弧)。

Example
// 此弧的中心坐标为 x=100, y=75,半径为 50。
// 要绘制一个完整的圆,弧从 0 弧度(0°)开始,到 2π 弧度(360°)结束。
var ctx = new Canvas();
this.widget.add(ctx);
ctx.beginPath();
ctx.arc(100, 75, 50, 0, 2 * Math.PI);
ctx.stroke();
Parameters:
Name Type Attributes Description
x Number

弧中心的 x 坐标。

y Number

弧中心的 y 坐标。

radius Number

弧的半径。必须为正值。

startAngle Number

弧开始的角度,单位为弧度,从正 x 轴开始计算。

endAngle Number

弧结束的角度,单位为弧度,从正 x 轴开始计算。

anticlockwise Number <optional>

可选布尔值。如果为 true,则在起始和结束角度之间反时针绘制弧。默认值为 false(顺时针)。

arcTo(x1, y1, x2, y2, radius)

See:

在两条切线之间创建一个弧/曲线。

Example
// 在此示例中,arcTo() 创建的路径是粗且黑色的。切线为灰色,控制点为红色,起始点为蓝色。
var ctx = new Canvas();
this.widget.add(ctx);
// 切线
ctx.beginPath();
ctx.strokeStyle = 'gray';
ctx.moveTo(200, 20);
ctx.lineTo(200, 130);
ctx.lineTo(50, 20);
ctx.stroke();

// 弧
ctx.beginPath();
ctx.strokeStyle = 'black';
ctx.lineWidth = 5;
ctx.moveTo(200, 20);
ctx.arcTo(200, 130, 50, 20, 40);
ctx.stroke();

// 起点
ctx.beginPath();
ctx.fillStyle = 'blue';
ctx.arc(200, 20, 5, 0, 2 * Math.PI);
ctx.fill();

// 控制点
ctx.beginPath();
ctx.fillStyle = 'red';
ctx.arc(200, 130, 5, 0, 2 * Math.PI); // 控制点1
ctx.arc(50, 20, 5, 0, 2 * Math.PI);   // 控制点2
ctx.fill();
Parameters:
Name Type Description
x1 Number

第一个控制点的 x 坐标。

y1 Number

第一个控制点的 y 坐标。

x2 Number

第二个控制点的 x 坐标。

y2 Number

第二个控制点的 y 坐标。

radius Number

弧的半径。必须为非负值。

beginPath()

See:

开始一个路径,或者重置当前路径。

Example
var ctx = new Canvas();
this.widget.add(ctx);
// 第一个路径
ctx.beginPath();
ctx.strokeStyle = 'blue';
ctx.moveTo(20, 20);
ctx.lineTo(200, 20);
ctx.stroke();

// 第二个路径
ctx.beginPath();
ctx.strokeStyle = 'green';
ctx.moveTo(20, 20);
ctx.lineTo(120, 120);
ctx.stroke();

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

See:

创建一条三次贝塞尔曲线。

Example
// 此示例展示如何绘制一条三次贝塞尔曲线。
var ctx = new Canvas();
this.widget.add(ctx);
// 定义各点 {x, y}
let start = { x: 50,    y: 20  };
let cp1 =   { x: 230,   y: 30  };
let cp2 =   { x: 150,   y: 80  };
let end =   { x: 250,   y: 100 };

// 绘制三次贝塞尔曲线
ctx.beginPath();
ctx.moveTo(start.x, start.y);
ctx.bezierCurveTo(cp1.x, cp1.y, cp2.x, cp2.y, end.x, end.y);
ctx.stroke();

// 起点和终点
ctx.fillStyle = 'blue';
ctx.beginPath();
ctx.arc(start.x, start.y, 5, 0, 2 * Math.PI);  // 起点
ctx.arc(end.x, end.y, 5, 0, 2 * Math.PI);      // 终点
ctx.fill();

// 控制点
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(cp1.x, cp1.y, 5, 0, 2 * Math.PI);  // 控制点1
ctx.arc(cp2.x, cp2.y, 5, 0, 2 * Math.PI);  // 控制点2
ctx.fill();
Parameters:
Name Type Description
cp1x Number

第一个控制点的 x 坐标。

cp1y Number

第一个控制点的 y 坐标。

cp2x Number

第二个控制点的 x 坐标。

cp2y Number

第二个控制点的 y 坐标。

x Number

终点的 x 坐标。

y Number

终点的 y 坐标。

clearRect(x, y, width, height)

See:

清除指定矩形区域内的像素。

Parameters:
Name Type Description
x Number

矩形起点的 x 坐标。

y Number

矩形起点的 y 坐标。

width Number

矩形的宽度。正值向右,负值向左。

height Number

矩形的高度。正值向下,负值向上。

clip()

See:

从原始画布中剪切出任意形状和大小的区域。

Example
var ctx = new Canvas();
this.widget.add(ctx);
// 创建圆形剪切区域
ctx.beginPath();
ctx.arc(100, 75, 50, 0, Math.PI * 2);
ctx.clip();
// 绘制被剪切的内容
ctx.fillStyle = 'blue';
ctx.fillRect(0, 0, ctx.width, ctx.height);
ctx.fillStyle = 'orange';
ctx.fillRect(0, 0, 100, 100);

closePath()

See:

从当前点创建一条路径返回到起始点。

Example
var ctx = new Canvas();
this.widget.add(ctx);
// 绘制一个三角形
ctx.beginPath();
ctx.moveTo(20, 140);   // 移动画笔到左下角
ctx.lineTo(120, 10);   // 连接到顶部
ctx.lineTo(220, 140);  // 连接到右下角
ctx.closePath();       // 返回到起始点(左下角)
ctx.stroke();

createImageData(width, height) → {ImageData}

Since:
  • EasyBuilder Pro V6.06.02

创建一个新的空白 ImageData 对象,具有指定的尺寸。 新对象中的所有像素均为透明黑色。

Example
const imageData = canvas.createImageData(100, 50);
Parameters:
Name Type Description
width Number

新 ImageData 对象的宽度。

height Number

新 ImageData 对象的高度。

Returns:
  • 一个具有指定宽度和高度的新 ImageData 对象, 新对象中的像素均为透明黑色。
Type
ImageData

createLinearGradient(x0, y0, x1, y1) → {CanvasGradient}

See:

创建一个线性渐变(用于画布内容)。

Example
var ctx = new Canvas();
this.widget.add(ctx);
// 创建一个线性渐变
// 起始渐变点坐标为 x=20, y=0
// 终止渐变点坐标为 x=220, y=0
var gradient = ctx.createLinearGradient(20, 0, 220, 0);

// 添加三个颜色停止点
gradient.addColorStop(0, 'green');
gradient.addColorStop(0.5, 'cyan');
gradient.addColorStop(1, 'green');

// 设置填充样式并绘制一个矩形
ctx.fillStyle = gradient;
ctx.fillRect(20, 20, 200, 100);
Parameters:
Name Type Description
x0 Number

起点的 x 坐标。

y0 Number

起点的 y 坐标。

x1 Number

终点的 x 坐标。

y1 Number

终点的 y 坐标。

Returns:
  • 一个用指定直线初始化的线性渐变对象。
Type
CanvasGradient

createRadialGradient(x0, y0, r0, x1, y1, r1) → {CanvasGradient}

See:

创建一个放射状/圆形渐变(用于画布内容)。

Example
// 此示例使用 createRadialGradient() 方法初始化一个放射状渐变。然后在渐变的两个圆之间创建三个颜色停止点。最后,将该渐变赋值给画布上下文,并渲染为填充的矩形。
var ctx = new Canvas();
this.widget.add(ctx);
// 创建一个放射状渐变
// 内圆位于 x=110, y=90, 半径为 30
// 外圆位于 x=100, y=100, 半径为 70
var gradient = ctx.createRadialGradient(110, 90, 30, 100, 100, 70);

// 添加三个颜色停止点
gradient.addColorStop(0, 'pink');
gradient.addColorStop(0.9, 'white');
gradient.addColorStop(1, 'green');

// 设置填充样式并绘制一个矩形
ctx.fillStyle = gradient;
ctx.fillRect(20, 20, 160, 160);
Parameters:
Name Type Description
x0 Number

起始圆的 x 坐标。

y0 Number

起始圆的 y 坐标。

r0 Number

起始圆的半径。必须为非负且有限的值。

x1 Number

终止圆的 x 坐标。

y1 Number

终止圆的 y 坐标。

r1 Number

终止圆的半径。必须为非负且有限的值。

Returns:
  • 一个用两个指定圆初始化的放射状渐变对象。
Type
CanvasGradient

fill()

See:

填充当前绘图路径。

Example
// 使用 fill() 方法填充一个矩形。
var ctx = new Canvas();
this.widget.add(ctx);
ctx.rect(10, 10, 150, 100);
ctx.stroke();

fillRect(x, y, width, height)

See:

绘制一个“填充”的矩形。

Example
var ctx = new Canvas();
this.widget.add(ctx);
ctx.fillStyle = 'green';
ctx.fillRect(20, 10, 150, 100);
Parameters:
Name Type Description
x Number

矩形起点的 x 坐标。

y Number

矩形起点的 y 坐标。

width Number

矩形的宽度。正值向右,负值向左。

height Number

矩形的高度。正值向下,负值向上。

fillText(text, x, y)

See:

在画布上绘制“填充”的文本。

Example
var ctx = new Canvas();
this.widget.add(ctx);
ctx.font = '50px serif';
ctx.fillText('Hello world', 50, 90);
Parameters:
Name Type Description
text String

要渲染到上下文中的文本字符串。文本将使用 font、textAlign、textBaseline 以及 direction 指定的设置进行渲染。

x Number

开始绘制文本的点的 x 坐标。

y Number

开始绘制文本的点的 y 坐标。

getImageData(sx, sy, sw, sh) → {ImageData}

Since:
  • EasyBuilder Pro V6.06.02

返回一个 ImageData 对象,表示画布指定区域的底层像素数据。

注意:

  • 此方法不受画布变换矩阵影响。
Example
canvas.rect(10, 10, 100, 100);
canvas.fill();

let imageData = canvas.getImageData(0, 0, 50, 50);
canvas.putImageData(imageData, 150, 10);
Parameters:
Name Type Description
sx Number

从中提取 ImageData 的矩形区域左上角的 x 坐标。

sy Number

从中提取 ImageData 的矩形区域左上角的 y 坐标。

sw Number

从中提取 ImageData 的矩形区域的宽度。

sh Number

从中提取 ImageData 的矩形区域的高度。

Returns:
  • 一个包含指定画布矩形区域图像数据的 ImageData 对象。
Type
ImageData

getLineDash() → {Array.Number}

See:

获取当前的虚线样式数组。

Example
var ctx = new Canvas();
this.widget.add(ctx);
ctx.setLineDash([10, 20]);
console.log(ctx.getLineDash());  // [10, 20]
Returns:
Type
Array.Number

isPointInPath(x, y) → {Boolean}

See:

如果指定的点在当前路径内,则返回 true,否则返回 false。

Example
// 检查某点是否在当前路径内。
var ctx = new Canvas();
this.widget.add(ctx);
ctx.rect(10, 10, 100, 100);
ctx.fill();
console.log(ctx.isPointInPath(30, 70));
Parameters:
Name Type Description
x Number

要检查的点的 x 坐标,不受当前上下文变换影响。

y Number

要检查的点的 y 坐标,不受当前上下文变换影响。

Returns:
Type
Boolean

lineTo(x, y)

See:

添加一个新点,并从上一个指定点到该点绘制一条线段。

Example
var ctx = new Canvas();
this.widget.add(ctx);
// 一条线从 (30, 50) 开始到 (150, 100) 结束。
ctx.beginPath();       // 开始一个新路径
ctx.moveTo(30, 50);    // 移动画笔到 (30, 50)
ctx.lineTo(150, 100);  // 绘制一条直线到 (150, 100)
ctx.stroke();          // 渲染路径
Parameters:
Name Type Description
x Number

线段终点的 x 坐标。

y Number

线段终点的 y 坐标。

measureText(text) → {Object}

返回一个对象,该对象包含指定文本的宽度。

Example
let text = canvas.measureText('Hello world');
console.log(text.width);
Parameters:
Name Type Description
text String

要测量的文本字符串。

Returns:
Type
Object

moveTo(x, y)

See:

将路径移动到指定画布中的点,但不创建线段。

Parameters:
Name Type Description
x Number

点的 x 坐标(水平)。

y Number

点的 y 坐标(垂直)。

putImageData(imageData, dx, dy)

Since:
  • EasyBuilder Pro V6.06.02

将给定 ImageData 对象中的数据绘制到画布上。

注意:

  • 此方法不受画布变换矩阵影响。
Example
let canvas = new Canvas();
let mouseArea = new MouseArea();

this.widget.add(canvas);
this.widget.add(mouseArea);

// 创建渐变
var grd = canvas.createLinearGradient(0, 0, canvas.width - 20, 0);
grd.addColorStop(0, "red");
grd.addColorStop(1, "white");

// 用渐变填充
canvas.fillStyle = grd;
canvas.fillRect(10, 10, canvas.width - 20, canvas.height - 20);

mouseArea.on('mousedown', (mouseEvent) => {
  const rvalue = getRandomInt(255);
  const gvalue = getRandomInt(255);
  const bvalue = getRandomInt(255);

  let imageData = canvas.createImageData(10, 10);
  for (let i = 0; i < imageData.data.length; i += 4) {
    imageData.data[i + 0] = rvalue;
    imageData.data[i + 1] = gvalue;
    imageData.data[i + 2] = bvalue;
    imageData.data[i + 3] = 255;
  }
  canvas.putImageData(imageData, mouseEvent.x - 5, mouseEvent.y - 5);
});

function getRandomInt(max) {
  return Math.floor(Math.random() * max);
}
Parameters:
Name Type Description
imageData ImageData

一个包含像素值数组的 ImageData 对象。

dx Number

将图像数据放置在目标画布中的水平位置(x 坐标)。

dy Number

将图像数据放置在目标画布中的垂直位置(y 坐标)。

quadraticCurveTo(cpx, cpy, x, y)

See:

创建一条二次贝塞尔曲线。

Example
// 此示例展示如何绘制一条二次贝塞尔曲线。
var ctx = new Canvas();
this.widget.add(ctx);
// 绘制二次贝塞尔曲线
ctx.beginPath();
ctx.moveTo(50, 20);
ctx.quadraticCurveTo(230, 30, 50, 100);
ctx.stroke();

// 起点和终点
ctx.fillStyle = 'blue';
ctx.beginPath();
ctx.arc(50, 20, 5, 0, 2 * Math.PI);   // 起点
ctx.arc(50, 100, 5, 0, 2 * Math.PI);  // 终点
ctx.fill();

// 控制点
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(230, 30, 5, 0, 2 * Math.PI);
ctx.fill();
Parameters:
Name Type Description
cpx Number

控制点的 x 坐标。

cpy Number

控制点的 y 坐标。

x Number

终点的 x 坐标。

y Number

终点的 y 坐标。

rect(x, y, width, height)

See:

创建一个矩形。

Example
// 矩形的左上角位于 (10, 20),宽 150,高 100。
var ctx = new Canvas();
this.widget.add(ctx);
ctx.rect(10, 20, 150, 100);
ctx.fill();
Parameters:
Name Type Description
x Number

矩形起点的 x 坐标。

y Number

矩形起点的 y 坐标。

width Number

矩形的宽度。正值向右,负值向左。

height Number

矩形的高度。正值向下,负值向上。

restore()

See:

恢复之前保存的路径状态和属性。

rotate(angle)

See:

对当前绘图进行旋转。

Parameters:
Name Type Description
angle Number

顺时针旋转的角度,单位为弧度。可使用 degree * Math.PI / 180 将角度转换为弧度。

save()

See:

保存当前上下文的状态。

scale(x, y)

See:

对当前绘图进行水平和垂直缩放。

Parameters:
Name Type Description
x Number

水平方向的缩放因子。负值会沿垂直轴翻转像素。值为 1 表示无水平缩放。

y Number

垂直方向的缩放因子。负值会沿水平方向翻转像素。值为 1 表示无垂直缩放。

setLineDash(segments)

See:

设置用于描边的虚线样式数组。

Example
// 此示例使用 setLineDash() 方法绘制一条虚线和一条实线。
var ctx = new Canvas();
this.widget.add(ctx);
// 虚线
ctx.beginPath();
ctx.setLineDash([5, 15]);
ctx.moveTo(0, 50);
ctx.lineTo(300, 50);
ctx.stroke();

// 实线
ctx.beginPath();
ctx.setLineDash([]);
ctx.moveTo(0, 100);
ctx.lineTo(300, 100);
ctx.stroke();
Parameters:
Name Type Description
segments Array.Number

一个数组,包含数字,指定了交替绘制实线和空白的距离(单位为坐标空间单位)。如果数组元素个数为奇数,则数组的元素会被复制并连接。例如,[5, 15, 25] 会变成 [5, 15, 25, 5, 15, 25]。如果数组为空,则清除虚线列表,线条将恢复为实线。

setTransform(a, b, c, d, e, f)

See:
  • MDN web docs 了解详情. // 此示例对一个矩形同时进行垂直 (0.2) 和水平 (0.8) 倾斜。缩放和平移保持不变。 var ctx = new Canvas(); this.widget.add(ctx); ctx.transform(1, 0.2, 0.8, 1, 0, 0); ctx.fillRect(0, 0, 100, 100);

重置当前变换为单位矩阵,然后执行 setTransform()。

Parameters:
Name Type Description
a Number

(m11) 水平缩放。值为 1 表示无缩放。

b Number

(m12) 垂直倾斜。

c Number

(m21) 水平倾斜。

d Number

(m22) 垂直缩放。值为 1 表示无缩放。

e Number

(dx) 水平平移(移动)。

f Number

(dy) 垂直平移(移动)。

stroke()

See:

实际绘制你已定义的路径。

Example
// 使用 rect() 方法创建一个矩形,然后使用 stroke() 方法将其绘制到画布上。
var ctx = new Canvas();
this.widget.add(ctx);
ctx.rect(10, 10, 150, 100);
ctx.stroke();

strokeRect(x, y, width, height)

See:

绘制一个矩形(不填充)。

Example
var ctx = new Canvas();
this.widget.add(ctx);
ctx.strokeStyle = 'green';
ctx.strokeRect(20, 10, 160, 100);
Parameters:
Name Type Description
x Number

矩形起点的 x 坐标。

y Number

矩形起点的 y 坐标。

width Number

矩形的宽度。正值向右,负值向左。

height Number

矩形的高度。正值向下,负值向上。

strokeText(text, x, y)

See:

在画布上绘制文本(不填充)。

Example
var ctx = new Canvas();
this.widget.add(ctx);
ctx.font = '50px serif';
ctx.strokeText('Hello world', 50, 90);
Parameters:
Name Type Description
text String

要渲染到上下文中的文本字符串。文本将使用 font、textAlign、textBaseline 以及 direction 指定的设置进行渲染。

x Number

开始绘制文本的点的 x 坐标。

y Number

开始绘制文本的点的 y 坐标。

transform(a, b, c, d, e, f)

See:

替换当前绘图的变换矩阵。

Example
// 此示例对一个矩形同时进行垂直 (0.2) 和水平 (0.8) 倾斜。缩放和平移保持不变。
var ctx = new Canvas();
this.widget.add(ctx);
ctx.transform(1, 0.2, 0.8, 1, 0, 0);
ctx.fillRect(0, 0, 100, 100);
Parameters:
Name Type Description
a Number

(m11) 水平缩放。值为 1 表示无缩放。

b Number

(m12) 垂直倾斜。

c Number

(m21) 水平倾斜。

d Number

(m22) 垂直缩放。值为 1 表示无缩放。

e Number

(dx) 水平平移(移动)。

f Number

(dy) 垂直平移(移动)。

translate(x, y)

See:

重新映射画布上 (0,0) 的坐标位置。

Example
// translate() 方法将上下文水平移动 110 像素,垂直移动 30 像素。第一个正方形相对于默认位置移动了这些距离。
var ctx = new Canvas();
this.widget.add(ctx);
// 移动后的正方形
ctx.translate(110, 30);
ctx.fillStyle = 'red';
ctx.fillRect(0, 0, 80, 80);

// 重置当前变换矩阵为单位矩阵
ctx.setTransform(1, 0, 0, 1, 0, 0);

// 未移动的正方形
ctx.fillStyle = 'gray';
ctx.fillRect(0, 0, 80, 80);
Parameters:
Name Type Description
x Number

水平方向移动的距离。正值表示向右移动,负值表示向左移动。

y Number

垂直方向移动的距离。正值表示向下移动,负值表示向上移动。