javascript全栈开发实践-web-2

273 阅读2分钟

我们目前仅仅测试实现了铅笔的功能。接下来我们继续增加一个新的功能:荧光笔。荧光笔通常是带有一定颜色,并且具有半透明特性,可以把下面的字迹显露出来。 而为了在铅笔和荧光笔之间进行切换,我们就需要增加两个按钮,来实现这个切换功能。 代码如下:

<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body style='background:lightgrey'>
    <div>
      <button id='pencil' onclick="handleChoosePencil()">pencil</button>
      <button id='highlighter' onclick="handleChooseHighlighter()">highlighter</button>
    </div>
    <canvas id='pad' width='800px' height='600px' style='background:white'></canvas>
  </body>
  <script>
    const pad = document.getElementById('pad');
    const ctx = pad.getContext('2d');
    ctx.lineWidth = 2;
    ctx.strokeStyle = 'blue';
    //
    pad.addEventListener('mousedown', handleMouseDown);
    //
    function handleMouseDown(event) {
      //
      ctx.beginPath();
      ctx.moveTo(event.offsetX, event.offsetY);
      //
      pad.addEventListener('mousemove', handleMouseMove);
      pad.addEventListener('mouseup', handleMouseUp);

    }
    //
    function handleMouseMove(event) {
      ctx.lineTo(event.offsetX, event.offsetY);
      ctx.stroke();
      ctx.beginPath();
      ctx.moveTo(event.offsetX, event.offsetY);
    }
    //
    function handleMouseUp(event) {
      pad.removeEventListener('mousemove', handleMouseMove);
      pad.removeEventListener('mouseup', handleMouseUp);
      //
    }
    //
    function handleChoosePencil(event) {
      ctx.strokeStyle = 'rgb(0, 0, 255)';
      ctx.lineWidth = 2;
    }
    //
    function handleChooseHighlighter(event) {
      ctx.strokeStyle = 'rgba(255, 255, 0, 0.5)';
      ctx.lineWidth = 8;
    }
    //
  </script>
</html>

首先,我们在html里面增加了两个按钮,并且分别绑定了事件。然后在事件响应方法里面,我们去设置画笔的颜色和粗细。其中给荧光笔设置了半透明。 如果我们只做了这一点修改,那么你会发现,荧光笔画出来的颜色一点都不透明。原因在于。我们之前的代码里面,只在handleMouseDown里面调用了一次beginPath,然后让画笔不断移动,然后调用stroke去显示这条路径。结果会导致,每次移动鼠标的时候,调用stroke显示的是从上一次beginPath之后记录的所有的路径,因此,在mouse move的时候,我们会重复绘制多次之前的路径,结果就导致半透明颜色叠加之后变成了不透明。

要解决这个问题,就需要每次移动鼠标,我们就绘制当次鼠标移动的路径,然后开启一个新的路径,这样下次绘制的时候,不会重复绘制之前已经画好的路径。 所以我们也修改了handleMouseDown。 接下来,我们会增加橡皮擦功能。