javascript – HTML5 Canvas可以更改所有行的颜色

我用 HTML5画布制作了一个简单的绘图应用程序.您可以点击两个不同的位置,从一个点到另一个点绘制一条线.我还有两个文本输入框,您可以在其中更改线条粗细和颜色.问题是,当我改变一行的颜色时,会改变所有之前绘制的线条.当更改线条厚度时也会发生这种情况,但是只有当我画出比以前更粗的线条(如果我画一条较薄的线条,其他线条不会改变).

我是HTML5的新手,所有的帮助将不胜感激.

<!DOCTYPE html>
<html>
<head>
<title>Canvas</title>
</head>
<body>
<canvas width="300" height="300" id="myCanvas"></canvas>
<br />
<input type="button" value="Enter Coordinates" onclick="enterCoordinates()"></input>
Line Width: <input type="text" id="linewidth"></input>
Line Color: <input type="text" id="lineColor"></input>
<script type="text/javascript">
    var c = document.getElementById('myCanvas');
    var ctx = c.getContext('2d');
    ctx.fillStyle="#FF0000";
    ctx.fillRect(0,300,300);
    function drawLine(start,start2,finish,finish2)
    {
        var c = document.getElementById('myCanvas');
        var ctx = c.getContext('2d');
            // optional variables
            linewidth = document.getElementById('linewidth').value;
            if (linewidth)
            {
                ctx.linewidth=linewidth;
            }
            lineColor = document.getElementById('lineColor').value;
            if (lineColor)
            {
                ctx.strokeStyle=lineColor;
            }
        ctx.moveto(start,start2);
        ctx.lineto(finish,finish2);
        ctx.stroke();
    }
    function enterCoordinates()
    {
        var values = prompt('Enter values for line.\n x1,y1,x2,y2','');
        var start = values.split(",")[0];
        var start2 = values.split(",")[1];
        var finish = values.split(",")[2];
        var finish2 = values.split(",")[3];
        drawLine(start,finish2);
    }
</script>
<script type="text/javascript">
  document.addEventListener("DOMContentLoaded",init,false);

  function init()
  {
    var canvas = document.getElementById("myCanvas");
    canvas.addEventListener("mousedown",getPosition,false);
  }

  function getPosition(event)
  {
    var x = new Number();
    var y = new Number();
    var canvas = document.getElementById("myCanvas");

    if (event.x != undefined && event.y != undefined)
    {
      x = event.x;
      y = event.y;
    }
    else // Firefox method to get the position
    {
      x = event.clientX + document.body.scrollLeft +
          document.documentElement.scrollLeft;
      y = event.clientY + document.body.scrollTop +
          document.documentElement.scrollTop;
    }

    x -= canvas.offsetLeft;
    y -= canvas.offsetTop;
    if (window.startx)
    {
        window.finishx = x;
        window.finishy = y;
        drawLine(window.startx,window.starty,window.finishx,window.finishy);
        // reset
        window.startx = null;
    }
    else
    {
        window.startx = x;
        window.starty = y;
    }
  }
</script>
</body>
</html>

解决方法

只需添加一个closePath()调用(以及beginPath),您可以在其中绘制行,如下所示:
ctx.beginPath();
ctx.moveto(start,start2);
ctx.lineto(finish,finish2);
ctx.stroke();
ctx.closePath();

否则,除了仅绘制最新的线,您将会再次绘制所有以前的线,因为开放路径仍然相同,从而导致线条改变颜色和宽度的效果,当您看到的是实际的新线被他们吸引.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...