javascript - 带有光标跟随器的 Canvas

标签 javascript jquery html css canvas

<分区>

$(function(){
     var mouseX = 0;
     var mouseY = 0;

     $('body,html').mousemove(function(e){
       var gap = parseInt($('#stalker').css("width")) / 2;
       mouseX = e.pageX - gap;
       mouseY = e.pageY - gap;
       $('#stalker').css('left', mouseX);
       $('#stalker').css('top', mouseY);
     });

     var canvas = document.getElementById('mycanvas');
     if(!canvas || !canvas.getContext) return false;
     var ctx = canvas.getContext('2d');

     ctx.lineWidth = 2;
     ctx.lineJoin = ctx.lineCap = 'round';

     var startX,
         startY,
         x,
         y,
         borderWidth = 5,
         isDrawing = false;

     $('#mycanvas,#stalker').mousedown(function(e){
        startX = e.pageX - $('#mycanvas').offset().left - borderWidth;
        startY = e.pageY - $('#mycanvas').offset().top - borderWidth;
     })
     .mouseup(function(e){
       if(!isDrawing) return;
       x = e.pageX - $('#mycanvas').offset().left - borderWidth;
       y = e.pageY - $('#mycanvas').offset().top - borderWidth;

       ctx.beginPath();
       ctx.moveTo(startX, startY);
       ctx.lineTo(x,y);
       ctx.stroke();
     })


     $('#mycanvas').mouseenter(function(e){
        startX = e.pageX - $('#mycanvas').offset().left - borderWidth;
        startY = e.pageY - $('#mycanvas').offset().top - borderWidth;
      });

     $('body,html').mousedown(function(e){
       isDrawing = true;
     })
     .mouseup(function(e){
       isDrawing = false;
     });

     $('#mycanvas,#stalker').mousemove(function(e){
       if(!isDrawing) return;
       x = e.pageX - $('#mycanvas').offset().left - borderWidth;
       y = e.pageY - $('#mycanvas').offset().top - borderWidth;

       ctx.beginPath();
       ctx.moveTo(startX, startY);
       ctx.lineTo(x,y);
       ctx.stroke();

       startX = x;
       startY = y;
     });

   });
#mycanvas{
  border:5px solid #999;
}
#stalker{
  position:absolute;
  width:80px;
  height:80px;
  border:solid 1px gray;
  border-radius:50%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<div id="stalker"></div>
<canvas width="550px" height="500px" id="mycanvas">
</canvas>

我正在尝试用 canvas 制作一个绘图应用程序, 我需要一个在绘图时始终跟随光标的圆圈。 所以我写了上面的代码, 但它并没有真正起作用:如果我慢慢地画一条线,它看起来不错,但如果我更快地移动光标,这条线就不会连接。 即使我没有释放鼠标点击,该行也会像两行或三行。 我认为这可能是因为 #stalker 没有 catch 光标的速度,所以我也在 #mycanvas 上放置了“mousedown”和“mousemove”,但仍然如此不起作用。

有人知道为什么吗?

最佳答案

你可以将鼠标位置保存在一个数组中,然后绘制它

一个简单的例子:

$(function(){
 var mouseX = 0;
 var mouseY = 0;

 $('body,html').mousemove(function(e){
   var gap = parseInt($('#stalker').css("width")) / 2;
   mouseX = e.pageX - gap;
   mouseY = e.pageY - gap;
   $('#stalker').css('left', mouseX);
   $('#stalker').css('top', mouseY);
 });

 var canvas = document.getElementById('mycanvas');
 if(!canvas || !canvas.getContext) return false;
 var ctx = canvas.getContext('2d');

 ctx.lineWidth = 2;
 ctx.lineJoin = ctx.lineCap = 'round';

 var startX,
     startY,
     x,
     y,
     borderWidth = 5,
     isDrawing = false,
     lines = [];

 $('body,html').mousedown(function(e){
   isDrawing = true;
   lines.push([]);
 })
 .mouseup(function(e){
   isDrawing = false;
 });

 $('#mycanvas,#stalker').mousemove(function(e){
   if(!isDrawing) return;
   x = e.pageX - $('#mycanvas').offset().left - borderWidth;
   y = e.pageY - $('#mycanvas').offset().top - borderWidth;

   lines[lines.length-1].push([x, y]);

 });

 function render() {
    ctx.clearRect(0, 0, 550, 500);

    for (const line of lines) {
        ctx.beginPath();
        for (const [i, pos] of Object.entries(line)) {
            if (!+i) {
                ctx.moveTo(pos[0], pos[1]);
            } else {
                ctx.lineTo(pos[0], pos[1]);
            }
        }
        ctx.stroke();
    }
 }

 (function loop() {
    render();
    requestAnimationFrame(loop);
 })();

});

关于javascript - 带有光标跟随器的 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064884/

上一篇:javascript - 如何调整按钮的断点,使它们折叠成一列?

下一篇:javascript - 当我缩小页面时,类 "rcorners2"的框在某些部分离开了页面。我该如何解决这个问题,以便它顺利缩小?

相关文章:

javascript - 在 javascript 文件中调用 PHP 函数

javascript - Jquery 类型错误 : $ is not a function

javascript - 以不同的速度滚动 div

javascript - 如何在客户端从灵活的 xml 生成 html 中的 TreeView

html - 在 Chrome 中点击按钮

javascript - 循环遍历表格单元格并使用 ForEach onClick - Javascript/Jquery

javascript - C# 和 JS 中的 WebSocketServers - 乱码

javascript - 如何使用 jQuery 动态添加链接到复选框或输入标记中的值

jquery - CSS:固定大小的div,固定的垂直位置和水平居中?

jquery - 将复选框序列化为 bool 属性和 MVC 绑定(bind)问题