Как с помощью флаттера реализовать эту анимацию холста html5

Недавно я изучаю флаттер, но я до сих пор не понимаю, как использовать холст флаттера,

Я надеюсь получить вашу помощь, здесь.

Как с помощью флаттера реализовать эту анимацию холста html5?

демонстрационная ссылка на анимацию jsfiddle

HTML-код

            margin: 0;
      padding: 0;
      background: #000000;
    }

    canvas {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
    }
  </style>
</head>

<body>
  <canvas id="mycanvas"></canvas>
  <script type="text/javascript">
    const mycanvas = document.getElementById('mycanvas')
    const context = mycanvas.getContext('2d')

    const canvasWidth = window.innerWidth
    const canvasHeight = window.innerHeight

    mycanvas.width = canvasWidth
    mycanvas.height = canvasHeight

    console.log(canvasWidth, canvasHeight);

    // 创建渐变
    function createGradient(context, p0, p1) {
      const gradient = context.createLinearGradient(p0.x, p0.y, p1.x, p1.y)

      gradient.addColorStop(0, 'rgba(255, 255, 0, 0)')
      gradient.addColorStop(1, 'rgba(255, 255, 0, 1)')

      return gradient
    }

    // 绘制曲线
    function createCurveLine(points) {
      const gradient = createGradient(context, points[0], points[points.length - 1])

      context.beginPath()
      context.moveTo(points[0].x, points[0].y)

      // 参数 points 是曲线上一部分连续点的集合,我们用 lineTo 把这些点连结起来,就近似的得到了曲线
      for (let i = 0; i < points.length; i++) {
        const p = points[i]
        context.lineTo(p.x, p.y)
      }

      context.moveTo(points[0].x, points[0].y)
      context.strokeStyle = gradient
      context.lineCap = 'round'
      context.lineWidth = 5
      context.shadowColor = 'rgba(255, 0, 255, 1)'
      context.shadowBlur = 10
      context.stroke()
    }

    const P0 = {
      x: 100,
      y: canvasHeight / 2
    }


    const P1 = {
      x: canvasWidth / 2,
      y: canvasHeight / 2 - 200
    }

    const P2 = {
      x: canvasWidth - 100,
      y: canvasHeight / 2
    }


    let t0 = 0
    let t1 = 0
    let points = [] // 存储曲线上点的集合
    const lineLength = 0.3;

    function draw() {
      context.clearRect(0, 0, canvasWidth, canvasHeight);

      if (t1 < lineLength) {
        t0 = 0;
      }

      if (t0 > 1 - lineLength) {
        t1 = 1;
      }

      const currentPoint = {
        x: computeCurvePoint(P0.x, P1.x, P2.x, t1),
        y: computeCurvePoint(P0.y, P1.y, P2.y, t1)
      }

      // 每当 t1 变化时,就将对应的点添加到 points 集合中
      points.push(currentPoint)

      const len = points.length

      context.save()
      if (len > 1) {
        createCurveLine(points.slice(Math.floor(len * t0), Math.max(Math.ceil(len * t1), 2)))
      }
      context.restore()
      t0 += 0.005
      t1 += 0.005

      if (t0 > 1 && t1 > 1) {
        t0 = 0
        t1 = 0
        points = []
      }

      requestAnimationFrame(draw)
    }

    draw()

    /*!
     * 计算二次贝塞尔曲线上的点
     * @param {Number} p0 起始点
     * @param {Number} p1 控制点
     * @param {Number} p2 结束点
     * @param {Number} t 0-1的集合
     * @return {Number} 返回计算后的点
     */
    function computeCurvePoint(p0, p1, p2, t) {
      return (1 - t) * (1 - t) * p0 + 2 * t * (1 - t) * p1 + t * t * p2
    }

    function arc(...points) {
      points.forEach(p => {
        context.beginPath()
        context.arc(p.x, p.y, 3, 0, Math.PI * 2)
        context.stroke();
      });
    }
  </script>
</body>

</html>

0 ответов

Другие вопросы по тегам