Canvas 基础(一)

canvas 系列:

Canvas 绘制图片不显示问题

Canvas 基础(一)

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 的,那么就需要使用第一种方法了

posted @   漠里  阅读(471)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示