跟随鼠标光标绘制画布线条

5
这是我通过按下/释放鼠标按钮在画布上绘制直线的方法。但这并不完全是我想要的:按下鼠标按钮将设置一条直线的起点,终点将跟随鼠标指针。但是直线应始终为一条直线 - 不应像现在绘制曲线。释放鼠标按钮后,直线完成/固定。
通过这种方式,用户应该能够在画布上任何位置以任何方向/旋转绘制直线。按下鼠标按钮设置直线的起点,释放鼠标按钮设置直线的终点。

$(function() {
  var letsdraw = false;

  var theCanvas = document.getElementById('paint');
  var ctx = theCanvas.getContext('2d');
  theCanvas.width = 420;
  theCanvas.height = 300;

  var canvasOffset = $('#paint').offset();

  $('#paint').mousemove(function(e) {
    if (letsdraw === true) {
      ctx.lineTo(e.pageX - canvasOffset.left, e.pageY - canvasOffset.top);
      ctx.stroke();
    }
  });

  $('#paint').mousedown(function() {
    letsdraw = true;
    ctx.strokeStyle = 'blue';
    ctx.lineWidth = 1;
    ctx.beginPath();
    ctx.moveTo(e.pageX - canvasOffset.left, e.pageY - canvasOffset.top);
  });

  $(window).mouseup(function() {
    letsdraw = false;
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<canvas id="paint"></canvas>

2个回答

9

如果您想修改画布上的内容,您需要使用 ctx.clearRect() 方法清除先前绘制的内容。

请看下面的示例:

$(function() {
  var letsdraw ;

  var theCanvas = document.getElementById('paint');
  var ctx = theCanvas.getContext('2d');
  theCanvas.width = 420;
  theCanvas.height = 300;

  var canvasOffset = $('#paint').offset();

  $('#paint').mousemove(function(e) {
    if (letsdraw) {
      ctx.clearRect(0,0,theCanvas.width,theCanvas.height);
      ctx.strokeStyle = 'blue';
      ctx.lineWidth = 1;
      ctx.beginPath();
    
      ctx.moveTo(letsdraw.x, letsdraw.y);
      ctx.lineTo(e.pageX - canvasOffset.left, e.pageY - canvasOffset.top);
      ctx.stroke();
    }
  });

  $('#paint').mousedown(function(e) {
    letsdraw = {
      x:e.pageX - canvasOffset.left,
      y:e.pageY - canvasOffset.top
      }
    
  });

  $(window).mouseup(function() {
    letsdraw = null;
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<canvas id="paint"></canvas>


几乎完美:当然我想保留完成的画线。用户应该能够使用这种方法画出三条线。 - user3142695
然后,您需要跟踪要保留的绘制线并在每次鼠标移动时重新绘制它们。 - maioman

1
你应该像这样做。

$(function() {
  var letsdraw = false;
  var theCanvas = document.getElementById('paint');
  var ctx = theCanvas.getContext('2d');
  theCanvas.width = 420;
  theCanvas.height = 300;
  var canvasOffset = $('#paint').offset();
  var lastpoints = {
    "x": 0,
    "y": 0
  };

  $('#paint').mousemove(function(e) {
    if (letsdraw === true) {
      lastpoints.x = e.pageX;
      lastpoints.y = e.pageY;
    }
  });

  $('#paint').mousedown(function(e) {
    letsdraw = true;
    ctx.strokeStyle = 'blue';
    ctx.lineWidth = 1;
    ctx.beginPath();
    ctx.moveTo(e.pageX - canvasOffset.left, e.pageY - canvasOffset.top);
  });

  $('#paint').mouseup(function(e) {
    ctx.lineTo(lastpoints.x - canvasOffset.left, lastpoints.y - canvasOffset.top);
    ctx.stroke();
    letsdraw = false;
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<canvas id="paint"></canvas>


这个程序完美地运行,但在绘制过程中没有显示进度。 - Shashank Bhatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接