# 代码复用
# 封装函数
// 封装的一个用于绘制圆角矩形的函数.
function roundedRect(ctx, x, y, width, height, radius) {
ctx.beginPath();
ctx.moveTo(x, y + radius);
ctx.lineTo(x, y + height - radius);
ctx.quadraticCurveTo(x, y + height, x + radius, y + height);
ctx.lineTo(x + width - radius, y + height);
ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius);
ctx.lineTo(x + width, y + radius);
ctx.quadraticCurveTo(x + width, y, x + width - radius, y);
ctx.lineTo(x + radius, y);
ctx.quadraticCurveTo(x, y, x, y + radius);
ctx.stroke();
}
function draw() {
const canvas = document.getElementById("demo5_1");
canvas.width = 200;
canvas.height = 200;
if (canvas.getContext) {
const ctx = canvas.getContext("2d");
roundedRect(ctx, 10, 10, 180, 180, 20, 20);
}
}
draw();
# 路径对象 Path2D()
Path2D()
会返回一个新初始化的 Path2D 对象
Path2D.addPath(path[, transform])
添加一条路径到当前路径
let path = new Path2D(); // 空的Path对象
let newPath = new Path2D(path); // 克隆Path对象
let pathFormSVG = new Path2D(d); // 从一个SVG创建
看代码
function draw() {
const canvas = document.getElementById("demo5_2");
canvas.width = 300;
canvas.height = 200;
if (canvas.getContext) {
const ctx = canvas.getContext("2d");
const rectangle = new Path2D();
rectangle.rect(10, 10, 50, 50);
const circle = new Path2D();
circle.moveTo(125, 35);
circle.arc(100, 35, 25, 0, 2 * Math.PI);
ctx.stroke(rectangle);
ctx.fill(circle);
const ellipse = new Path2D(
"M 110 120, C 110 140 ,190 140, 190 120 C 190 100, 110 100 ,110 120 Z"
);
ctx.stroke(ellipse);
}
}
draw();
看效果
# 图章 Patterns
玩过 scratch 和 Adboe Acrobat DC 的小伙伴可能知道有一个绘图工具叫做图章,图章代表了一个可被重复使用的图形,或者由一组绘画命令组成的整体图形。
在Canvas中使用createPattern(image,type)
来创建一个图章,其来源可以是一个Image
对象的引用,或者另一个canvas
对象,type
必须是以下字符串之一:repeat,repeat-x,repeat-y 和 no-repeat,类似于 CSS 中的 background-repeat
看代码
function draw() {
const canvas = document.getElementById("demo5_3");
canvas.width = canvas.height = 300;
const ctx = canvas.getContext("2d");
const img = new Image();
img.src = "https://www.gausszhou.top/static/image/learn/canvas/canvas_createpattern.png";
img.onload = function () {
const pattern = ctx.createPattern(img, "repeat");
ctx.fillStyle = pattern;
ctx.fillRect(0, 0, 300, 300);
};
}
draw();
看效果