如何在移动设备的画布上绘图?

Posted

技术标签:

【中文标题】如何在移动设备的画布上绘图?【英文标题】:How can i draw on a canvas in mobile device? 【发布时间】:2021-09-02 17:58:09 【问题描述】:

我的代码中有一些画布。所有这些都像一块黑板,这些画布让我可以在图像上绘图,但是当我尝试在设备中绘图时,什么也没有发生。这是我所有的代码:

let configureCanvas = canvas => 
  let ctx = canvas.getContext("2d");
  let painting = canvas.parentNode;
  let paintStyle = getComputedStyle(painting);


  if(canvas == document.getElementById("pizarra-musculos")) 
      var x = window.matchMedia("(max-width: 700px)")
      myFunction(x) // Call listener function at run time
      x.addListener(myFunction) // Attach listener function on state changes 
      function myFunction(x) 
      if (x.matches)  // If media query matches
          canvas.width = "350";
          canvas.height = "350";
         else 
          canvas.width = "500";
          canvas.height = "500";
        
      
  else
    canvas.width = "350";
    canvas.height = "350";
  


  let mouse = 
    x: 0,
    y: 0
  ;

  canvas.ontouchstart = function(e)
    var touches = e.touches || [];
    var touch = touches[0] || ;
  

  canvas.addEventListener('mousemove', function(e) 
    mouse.x = e.pageX - this.offsetLeft;
    mouse.y = e.pageY - this.offsetTop
  , false);

  if(canvas == document.getElementById("pizarra-musculos")) 
     //Rojo Claro
    ctx.lineWidth = 12;
    ctx.lineJoin = 'round';
    ctx.lineCap = 'round';
    ctx.strokeStyle = 'rgba(255, 8, 53, 0.02)';

    document.getElementById("btnRojoClaro").addEventListener("click", ()=>
      //Rojo Claro
      ctx.lineWidth = 12;
      ctx.lineJoin = 'round';
      ctx.lineCap = 'round';
      ctx.strokeStyle = 'rgba(255, 8, 53, 0.02)';
    );
    document.getElementById("btnVerde").addEventListener("click", ()=>
      //Rojo Claro
      ctx.lineWidth = 4;
      ctx.lineJoin = 'round';
      ctx.lineCap = 'round';
      ctx.strokeStyle = '#249120';
    );
    document.getElementById("btnRojo").addEventListener("click", ()=>
      //Rojo Claro
      ctx.lineWidth = 4;
      ctx.lineJoin = 'round';
      ctx.lineCap = 'round';
      ctx.strokeStyle = '#ff0000';
    );
    document.getElementById("btnNegro").addEventListener("click", ()=>
      //Negro
      ctx.lineWidth = 4;
      ctx.lineJoin = 'round';
      ctx.lineCap = 'round';
      ctx.strokeStyle = '#000000';
    );
    document.getElementById("btnAzul").addEventListener("click", ()=>
      //Azul
      ctx.lineWidth = 4;
      ctx.lineJoin = 'round';
      ctx.lineCap = 'round';
      ctx.strokeStyle = '#1e5085';
    );


  else
    ctx.lineWidth = 3;
    ctx.lineJoin = 'round';
    ctx.lineCap = 'round';
   ctx.strokeStyle = '#e34f54';
  ;

  canvas.addEventListener('mousedown', function(e) 
    ctx.beginPath();
    ctx.moveTo(mouse.x, mouse.y);
    canvas.addEventListener('mousemove', onPaint, false);
  , false);

  canvas.addEventListener('mouseup', function() 
    canvas.removeEventListener('mousemove', onPaint, false)
  , false);

  var onPaint = function() 
    ctx.lineTo(mouse.x, mouse.y);
    ctx.stroke();
  ;

  canvas.nextElementSibling.addEventListener('click', function() 
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  );


PD:我了解了 mozila 开发人员的触摸屏,但我无法在设备上使用此画布...感谢您了解我的问题。

【问题讨论】:

在那个 sn-p 中甚至不能在 PC 上绘图 @Samathingamajig 你什么意思?我可以在电脑上画画 当我点击“Rune code sn-p”并尝试绘制时,什么也没有发生 哦,是的,因为它需要 html 部分才能工作......但我需要在触摸上获取事件并在移动设备而不是桌面上绘制画布 【参考方案1】:

javascript中,你可以添加监听器!这意味着将监听某些内容并在激活监听器时执行代码!

例如,如果你在js中在html中声明<button id="mybutton"></button>,你可以用document.getElementById("mybutton")检索这个按钮,这样你就可以操作元素本身,值,返回,动作等等……

让我们存储这个元素var button = document.getElementById("mybutton") 现在console.log(button) 会显示这个元素,很酷吧?

在这个按钮上你可以添加监听器,例如 onClick 会在按钮被点击时执行一个函数 button.addEvenListenner("onClick", my_function)

所以现在当您单击按钮时,您将执行 my_function(当然,您需要创建 my_function)

但在您的情况下,您希望获得鼠标移动或有人在手机上使用手指时的 eventListenner!

您已经成功了,例如使用“mousemove”!或'mouseup'等... 桌面是电话,反之亦然! 你的手机上没有鼠标你有你的手指,所以当有人触摸屏幕时需要有一个监听器!

这就是'touchstart'事件监听器的作用,当你触摸屏幕时,你可以调用一个函数来做任何你想做的事情!

这四个监听器对你的项目来说已经足够了,你为什么会问? 'touchstart' 告诉你什么时候触摸屏幕 'touchend' 告诉您何时将手指从屏幕上移开 'touchmove' 告诉您何时在屏幕上拖动手指(touchstart 和 touchmove 不是一回事!) 'touchcancel' 告诉你什么时候取消(老实说我不知道​​,我猜你不需要它)

现在您需要将侦听器添加到画布中

var canvas = document.getElementById("pizarra-musculos")

然后你添加你的监听器

  canvas.addEventListener("touchstart", handleStart);
  canvas.addEventListener("touchend", handleEnd);
  canvas.addEventListener("touchmove", handleMove);

现在,当使用这 3 个侦听器之一时,将调用它们旁边的函数! 因此,您可以在这些函数中执行任何您想要的操作

 function handleMove(e) 
      // Cache the client X/Y coordinates
      var clientX = e.touches[0].clientX;
      var clientY = e.touches[0].clientY;
    

通过这段代码,您可以跟踪屏幕手指的 x 和 y,尝试每个侦听器以了解它们何时被调用等。放置一些 console.log 来打印值,您将做起来不难,希望对你有帮助

【讨论】:

嘿@nerap,感谢您的回复...但我是canvas和js领域的菜鸟,您能为我解释一下吗?

以上是关于如何在移动设备的画布上绘图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使fabricJS画布在移动设备上可水平拖动?

仅在移动设备上进行基础画布外导航?

在移动设备上没有触发第二次点击画布

我应该如何使用 createJs 创建响应式画布以适应不同的移动设备屏幕?

在 HTML5 画布上工作时出现 JavaScript (JQuery) 问题

记录和存储高分辨率手绘图