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

  • 相关阅读:
    拓扑排序
    最少硬币问题(无穷硬币)
    第三届蓝桥杯预赛
    矩形嵌套
    《心术》影评
    区间选点问题
    [转贴] 游戏服务器架构
    D3DXPlaneFromPoints 函数
    内存池实现
    [转]MMORPG游戏服务器端的设计
  • 原文地址:https://www.cnblogs.com/zhurong/p/13957390.html
Copyright © 2020-2023  润新知