Canvas 基础学习(一)

一、前言

最近在看到公众号文章,关于流星雨的,看着效果挺好。就跟着做了。

在做的过程中,对 Canvas 有了一些了解。同时在使用过程中会有一些问题。在这里总结记录下。

二、width、height

首先 canvas 元素有自己的属性 width、height。同时也可以设置 CSS 的 width、height。

对于这两者的区别,最开始我以为是一样的。只有在 CSS 中设置就好了。

但是两者完全不一样。在 MDN 有这样一句话:当没有设置宽度和高度的时候,canvas会初始化宽度为300像素和高度为150像素

是的,有默认值。

所以,我以为的流星雨效果是这样:

可是当没有设置 canvas 属性 width、height时是这样

这是什么鬼。

再回头看看 MDN 上面的说明:如果CSS的尺寸与初始画布的比例不一致,它会出现扭曲

我只是设置了 CSS 的尺寸,没有设置 canvas 画布尺寸。两者不一样,而且差距有点大,就出现扭曲、变形。

一般是这样设置的:

// 这里设定,css 中已经设置了尺寸
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
canvas.width = canvas.offsetWidth
canvas.height = canvas.offsetHeight

这样设置后看到了想要的效果。

三、beginPath、moveTo 的使用

beginPath 是开始绘制一段路径。

一般路径绘制完成,要使用 stroke 或者 fill 进行绘制或者填充。

但是想绘制多段路径怎么办呢?

1、每次都调用 beginPath、stroke

实现如下:

      this.canvasTxt.beginPath()
      this.canvasTxt.arc(250, 150, 50, 0, Math.PI * 2, true)
      this.canvasTxt.stroke()
      this.canvasTxt.beginPath()
      this.canvasTxt.arc(250, 150, 35, 0, Math.PI, false)
      this.canvasTxt.stroke()
      this.canvasTxt.beginPath()
      this.canvasTxt.arc(235, 120, 5, 0, Math.PI * 2, true)
      this.canvasTxt.stroke()
      this.canvasTxt.beginPath()
      this.canvasTxt.arc(265, 120, 5, 0, Math.PI * 2, true)
      this.canvasTxt.stroke()

2、从一个路径到另外一个路径使用 moveTo

如下面的代码:

      this.canvasTxt.beginPath()
      this.canvasTxt.arc(250, 150, 50, 0, Math.PI * 2, true)
      this.canvasTxt.moveTo(285, 150)
      this.canvasTxt.arc(250, 150, 35, 0, Math.PI, false)
      this.canvasTxt.moveTo(240, 120)
      this.canvasTxt.arc(235, 120, 5, 0, Math.PI * 2, true)
      this.canvasTxt.moveTo(270, 120)
      this.canvasTxt.arc(265, 120, 5, 0, Math.PI * 2, true)
      this.canvasTxt.stroke()

如果都是路径的绘制,可以使用 moveTo 更简洁方便。

但是其中如果有是需要 fill 的,那么就需要使用第一中方法了

原文地址:https://www.cnblogs.com/zhurong/p/13957390.html