Cavans 简单入门小教程 2

简介: 前端西瓜哥

大家好,我是前端西瓜哥。

今天继续讲解 Cavans 入门小教程的第二部分。

清空画布的指定矩形区域

ctx.clearRect(x, y, width, height);

清除左上角坐标为 (x, y),宽高为 width 和 height 的矩形区域范围。

清除整个画布 的写法为:

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);

另外,如果你重新设置 canvas 元素的宽或高,画布也会整个清空。

canvas.height = canvas.height;

绘制文字

ctx.fillStyle = '#5391F5'; // 蓝色
ctx.font = '48px serif';
ctx.textBaseline = 'top';
ctx.fillText('Hello Canvas!', 10, 10); // 填充文字
ctx.lineWidth = 2;
ctx.strokeText('Hello Canvas!', 10, 10); // 描边文字

我们先设置一下字体的样式。

ctx.font 用于指定字体的样式,默认值为 10px sans-serif

ctx.font 的取值同 CSS 的 font 属性。font 是个简写属性,即多个属性的组合。其中必须要包含 font-sizefont-family 属性,否则就会失效。

我一直觉得简写属性是个坏文明,因为它通常有太多的属性,而且可以有多种组合方式,不好记忆。

Canvas 没有提供 fontSize 属性,你只能通过 font 属性来设置文字大小,还得额外设置一个 font-family 属性,挺糟心的属于是。

ctx.textBaseline 用于设置文字的基线,默认值为 alphabetic

image.png

考虑到我们设置坐标时,习惯为左上角,所以可以考虑将 textBaseline 设置为 top

ctx.fillText()方法传入(1)文字内容、(2)文字起点的坐标、以及(3)可选的最大宽度,文字超过这个宽度,就会为适应这个宽度把文字挤扁。

ctx.strokeText() 用法同 ctx.fillText,不再赘述。

绘制的效果如下:

image.png

绘制图片

const img = new Image();
img.src = './watermelon.jpg';
img.onload = function() {
  ctx.drawImage(img, 300, 0); // 将图片绘制到画布的 (300, 0) 位置。
}

我们通过 ctx.drawImage() 方法来绘制图片。

该方法有多种传参方式,可以实现只使用图片的部分区域,然后进行缩放。

但本文是入门文章,所以上面的代码只是将原图片不做额外处理,原封不动地绘制到画布上。

绘制的结果如下:

image.png

存档和回档

因为我们每次要绘制新的图形,可能要临时修改全局的一些属性,比如 fillStylefont 之类的,在绘制完这个图形后再恢复。

如果我们每次都要记住修改了哪些属性,然后再显式地改回原来的属性,那成本实在是太大了,还容易泄漏。

所以 Canvas 提供了一对方法来解决这个问题。

ctx.fillStyle = '#5391f5'; // 此时 #5391f5 蓝色
ctx.save(); // 存档
ctx.fillStyle = '#FFDF5C'; // 黄色
ctx.fillRect(20, 80, 20, 20);
ctx.restore(); // 回档,fillStyle 重新变回蓝色
ctx.fillRect(50, 80, 20, 20);

ctx.save() 会将当前的绘制状态全部保存起来,然后执行 ctx.restore() 则会将这个状态读取回来,并将之前的存档删除。

其实底层是一个栈,你可以连续 save,会将多个绘制状态推入栈,然后 restore 则会将最顶部的绘制状态出栈,然后应用到 canvas 上。

图片的绘制结果为:

image.png

结尾

本文讲解了如何清空特定区域、绘制文字、绘制图片、存档和回档的操作,建议你也要动手尝试一番。

相关文章
|
安全 C++
【C ++】C++入门知识(二)
C++入门(二) 作者:小卢 专栏:《C++》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》
66 0
|
5月前
|
编译器 程序员 C语言
C++入门
C++入门
42 5
|
存储 编译器 C语言
C++11入门
C++11入门
100 1
|
7月前
|
编译器 Linux C语言
1.C++入门(中)
1.C++入门(中)
|
存储 安全 编译器
|
8月前
|
Linux 编译器 开发工具
【c++】入门2
【c++】入门2
58 2
|
编译器 C语言 C++
C++入门1(上)
C++入门1(上)
102 0
|
存储 Java
ASN.1入门(超详细)
ASN.1入门(超详细)
892 0
|
存储 安全 编译器
【C++】C++入门(下)
【C++】C++入门(下)
86 0
|
存储 编译器 程序员
【C++】C++ 入门(3)
【C++】C++ 入门(3)
100 0
【C++】C++ 入门(3)