Canvas API: Desenhando com o Mouse em JavaScript
Anteriormente, discutimos principalmente gráficos estáticos no canvas. No entanto, também podemos criar formas dinamicamente, desenhando com o ponteiro do mouse.
Para isso, vamos definir a seguinte página:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Programício</title>
  </head>
  <body>
    <canvas id="canvas" width="400" height="250" style="background-color: #eee; border: 1px solid #ccc; margin: 10px"></canvas>
    <script>
      const canvas = document.getElementById("canvas");
      const context = canvas.getContext("2d");
      const w = canvas.width;
      const h = canvas.height;
      const mouse = { x: 0, y: 0 }; // coordenadas do mouse
      let draw = false;
      // Evento de pressionar o mouse
      canvas.addEventListener("mousedown", function (e) {
        mouse.x = e.pageX - this.offsetLeft;
        mouse.y = e.pageY - this.offsetTop;
        draw = true;
        context.beginPath();
        context.moveTo(mouse.x, mouse.y);
      });
      // Evento de mover o mouse
      canvas.addEventListener("mousemove", function (e) {
        if (draw) {
          mouse.x = e.pageX - this.offsetLeft;
          mouse.y = e.pageY - this.offsetTop;
          context.lineTo(mouse.x, mouse.y);
          context.stroke();
        }
      });
      // Evento de soltar o mouse
      canvas.addEventListener("mouseup", function (e) {
        mouse.x = e.pageX - this.offsetLeft;
        mouse.y = e.pageY - this.offsetTop;
        context.lineTo(mouse.x, mouse.y);
        context.stroke();
        context.closePath();
        draw = false;
      });
    </script>
  </body>
</html>Para processar o movimento do mouse no elemento canvas, foram definidos três manipuladores de eventos: para pressionar, mover e soltar o mouse. Quando o mouse é pressionado, a variável draw é definida como true, iniciando o desenho. Além disso, ao pressionar, fixamos o ponto inicial de onde o desenho começará.
Ao mover o mouse, obtemos a nova posição do ponteiro e desenhamos uma linha até ela. Quando o ponteiro é solto, fechamos o caminho gráfico com o método context.closePath() e redefinimos a variável draw para false.
