h5 canvas(2)

162 阅读3分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

  1. ctx.save()
    每当save()方法被调用后,当前的状态就被推送到栈中保存。

  2. ctx.restore(x, y)
    每一次调用 restore 方法,上一个保存的状态就从栈中弹出

  3. translate(x, y)
    用来移动 canvas 的原点到指定的位置

  4. ctx.rotate()
    旋转坐标轴

  5. ctx.scale()
    缩放坐标轴

save && restore

save 和 restore 方法就是是用来保存和恢复 canvas 状态的

可以调用任意多次 save方法,类似数组的 push()
调用 restore 方法,上一个保存的状态就从栈中弹出,类似数组的 pop()
下面可以看到利用上面两个方法,方便的画出对称的颜色

ctx.fillRect(0, 0, 150, 150);   // 使用默认设置绘制一个矩形
ctx.save();                  // 保存默认状态

ctx.fillStyle = 'red'       // 在原有配置基础上对颜色做改变
ctx.fillRect(15, 15, 120, 120); // 使用新的设置绘制一个矩形

ctx.save();                  // 保存当前状态
ctx.fillStyle = '#FFF'       // 再次改变颜色配置
ctx.fillRect(30, 30, 90, 90);   // 使用新的配置绘制一个矩形

ctx.restore();               // 重新加载之前的颜色状态
ctx.fillRect(45, 45, 60, 60);   // 使用上一次的配置绘制一个矩形

ctx.restore();               // 加载默认颜色配置
ctx.fillRect(60, 60, 30, 30);   // 使用加载的配置绘制一个矩形

image.png

translate

我们每次调用translate,都会改变canvas原点的位置,如果绘制的两个东西完全不相关的话,就不应该按照第一个图案绘制完的点去计算绘制第二个图案。

所以我们很需要一个记录原点和回复恢复原点的方法,其实也不应该说是原点,因为如果是绘制三个或三个以上的图案,记录了多次,恢复也就恢复上一次保存的点。

如果我们没有调用上面的两个方法,就会出现这种情况

ctx.translate(50, 50);
ctx.strokeRect(0, 0, 100, 100)
ctx.translate(100, 100);
ctx.fillRect(0, 0, 100, 100)

image.png

如果我们调用了的话,就会回到原点了,根据原点来进行绘制

ctx.save(); //保存坐原点平移之前的状态
ctx.translate(50, 50);
ctx.strokeRect(0, 0, 100, 100)
ctx.restore(); //恢复到最初状态
ctx.translate(100, 100);
ctx.fillRect(0, 0, 100, 100)

image.png

rotate

我们还可以将canvas的绘制进行旋转

ctx.translate(100, 100);
ctx.rotate(Math.PI / 180 * 45);
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 100, 100);

image.png

scale

当然,我们也可以将canvas的绘制进行缩放, 他有两个参数,第一个:缩放x轴。第二个:缩放y轴

ctx.save();
ctx.translate(100, 100);
ctx.rotate(Math.PI / 180 * 10);
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 100, 100);
ctx.restore();

ctx.save();
ctx.scale(0.5,0.5);
ctx.fillStyle = "black";
ctx.fillRect(0, 0, 100, 100);

image.png

画图片

// 参数 1:要绘制的 img

// 参数 2、3:源img被切的坐标 x和y轴

// 参数 4、5:源img坐标那开始的width 和 height

// 参数 6、7:放在canvas的哪里,x和y轴

// 参数 8、9:切出来的img要展示的width 和 height

const img = new Image();
img.onload = function(){
    ctx.drawImage(img, 0, 0, img.width, img.height, 20, 20, 200, 200)
}
img.src = './img.jpeg';

image.png 我觉得菜鸟教程这个图就很清晰了 image.png