如何使用手写笔在 HTML5 画布上绘图

2024-05-07

我使用 onmousedown、onmousemove 和 onmouseup 事件在 HTML5 画布对象上使用 JavaScript 进行绘制。一切正常。

现在我想用手写笔替换鼠标(Wacom Intuos Pro) 因此我用 onpointerdown、onpointerup 和 onpointermove 替换了鼠标事件。

但现在,如果我触摸并移动笔,我不会收到任何 onpointermove 事件,而是拖动整个页面。通过将 html, body {overflow: hide} 添加到 HTML 构造中,我可以防止这种行为,但我仍然没有收到任何 onpointermove 事件。只有当笔位于平板电脑上方时我才会得到这些。

有人知道如何解决它吗?

目前,这是我使用的概念(但不起作用):

$(function() {
   var el=document.getElementById("myDraw");
    el.onpointerdown = down_handler;
    el.onpointerup = up_handler;
    el.onpointermove = move_handler;
    ctx = el.getContext("2d");
    ctx.canvas.width  = window.innerWidth*0.75;
    ctx.canvas.height = window.innerHeight*0.75;
});



function move_handler(ev) 
{ 
if (onTrack>0)
{
    var xPosition = ev.clientX-getPosition(document.getElementById("myDraw")).x;
    var yPosition = ev.clientY-getPosition(document.getElementById("myDraw")).y;
    ctx.beginPath();
    ctx.lineWidth=10*ev.pressure;
    ctx.moveTo(lastX,lastY);
    ctx.lineTo(xPosition,yPosition);
    ctx.stroke();     
    lastX = xPosition; 
    lastY = yPosition;
}
}

function down_handler(ev) 
{
    var xPosition = ev.clientX-getPosition(document.getElementById("myDraw")).x;
    var yPosition = ev.clientY-getPosition(document.getElementById("myDraw")).y;
    ctx.beginPath();
    ctx.arc(xPosition, yPosition, 5, 0, 2 * Math.PI);
    ctx.stroke();     
    startX = xPosition;
    startY = yPosition;
    lastX = xPosition;
    lastY = yPosition;
    onTrack=1;
    var el=document.getElementById("myRemoteDraw");
   el.setPointerCapture(ev.pointerId);
    console.log('pointer down '+ev.pointerId);
}


function up_handler(ev) 
{
    var xPosition = ev.clientX-getPosition(document.getElementById("myDraw")).x;
    var yPosition = ev.clientY-getPosition(document.getElementById("myDraw")).y;
    ctx.beginPath();
    ctx.rect(xPosition-5, yPosition-5, 10, 10);
    ctx.stroke();     
    onTrack = 0;
    var el=document.getElementById("myRemoteDraw");
    el.releasePointerCapture(ev.pointerId);
    console.log('pointer up '+ev.pointerId);
}

这个 CSS 应该可以帮助你:

<style>
    /* Disable intrinsic user agent touch behaviors (such as panning or zooming) */
    canvas {
      touch-action: none;
    }
</style>

或者在 JavaScript 中:

ctx.canvas.style.touchAction = "none";

更多详情来自这个关于“触摸动作”的链接 https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action and 此链接中有关输入的一些一般信息 https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events:

touch-action CSS 属性用于指定浏览器是否应将其默认(本机)触摸行为(例如缩放或平移)应用于某个区域。此属性可应用于除以下元素之外的所有元素:非替换内联元素、表行、行组、表列和列组。

auto 值表示浏览器可以自由应用其默认触摸行为(到指定区域),none 值则禁用该区域的浏览器默认触摸行为。 pan-x 和 pan-y 值分别表示从指定区域开始的触摸仅适用于水平和垂直滚动。值操作意味着浏览器可能会认为在元素上开始的触摸仅用于滚动和缩放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用手写笔在 HTML5 画布上绘图 的相关文章

随机推荐

  • 如何解决 npm install 中的身份验证错误?

    在我的 package json 中 我有一个名为 somerepo git 的私人存储库 现在我通过 maven 在 buildserver bamboo 上运行 npm install 并收到此错误 ERROR npm ERR Comm
  • Rails 命名空间与嵌套资源

    假设我的应用程序有两个模型 Foo 和 Bar Foo 可选地属于 Bar 现在我可以查看单个 Foo 或者搜索特定的 Foo FoosController 会处理所有这些 我的网址是这样的 foos 1 and foos new 有时我想
  • php:不知从何而来的空行

    我有奇怪的错误 不知道如何解决它而不浪费太多时间 我的控制器中有一个方法 应该使用以下方法返回 xml header Content type text xml header Content Disposition attachment f
  • CQRS - 读取端的事件重播

    我读过几篇关于 CQRS 的博客 它们都解释说 在写入端 事件会持久保存在事件存储中 并且根据请求 事件将被检索并聚合重播 我的问题是为什么读取端不需要聚合事件重播 因为您的读取端不使用聚合 读取端实现为投影 它根据聚合发出的事件流计算当前
  • 设计如何覆盖 send_confirmation_instructions

    我正在尝试重写方法 send confirmation instructions 如下所示 http trackingrails com posts devise send confirmation mail manually or del
  • Serilog - RollingFile Sink 不会根据日期和大小滚动文件

    我正在使用 Serilog RollingFile Sink 但它将一天的所有数据存储在一个文件中 在我的应用程序中 一天写入 1 GB 日志 所以我想根据日期和大小滚动日志文件 如何配置 RollingFile Sink 根据日期和大小滚
  • 小于函数取消引用指针

    在某些情况下 STL 容器中有指针 并且小于比较不应通过指针进行 而应通过所指向的对象进行 一个简单的例子是一个应按实数排序的向量 目前我用以下方法解决这个问题 template
  • 将 jsonwebtoken 与 angular-cli 应用程序一起使用时出错

    我有一个 angular2 应用程序 它使用角度 cli https github com angular angular cli 20angular cli用于脚手架和其他任务 但现在我不能使用jsonwebtoken https git
  • 有向图的并查/不交集数据结构

    我正在寻找一个高效的联查 aka 不相交集 https en wikipedia org wiki Disjoint set data structure 我的数据结构有向图 https en wikipedia org wiki Dire
  • 获取符合某些条件的 Pandas DataFrame 的列和行索引对

    假设我有一只熊猫DataFrame喜欢跟随 这些值基于距离矩阵 A pd DataFrame 1 0 0 8 0 6708203932499369 0 6761234037828132 0 7302967433402214 0 8 1 0
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • AES加密结果只有部分数据正确(使用mcrypt lib)

    我从以下位置下载了 AES 加密的示例代码https gist github com 2436364 https gist github com 2436364我修改了部分源代码以满足我的项目要求 如下 include
  • 如何创建服务总线触发webjob?

    我检查doc https learn microsoft com en us azure app service webjobs sdk how to service bus trigger configuration version 3x
  • 猴子修补@property

    是否有可能对 a 的值进行猴子修补 property我无法控制的类的实例 class Foo property def bar self return here be dragons f Foo print f bar baz f bar
  • :: 右侧的非法标记

    我有以下模板声明 template
  • 如何阻止猴子的疯狂行为?

    我正在使用 Monkey 工具来运行我的 Android 应用程序的测试 例如 我可能会执行如下所示的运行 adb shell monkey p com myapp v 10000 然而 如果我改变主意并需要取消测试 似乎没有办法不需要等待
  • YII 使用 gzip 压缩应用程序输出

    下面的代码有两个事件 有什么好处 它实际上在做什么 require once yii app Yii createWebApplication config Yii app gt onBeginRequest function event
  • Gradle 在 Android Studio 中应用插件(导航栏的 safeargs)

    我正在尝试学习 Android studio 并遵循官方教程 但在有关 Gradle 的部分遇到了障碍 因为该指南似乎已经过时了 指南是here https developer android com codelabs build your
  • 寻找 Dagger 辅助注射的示例

    From 匕首讨论 https groups google com forum topic dagger discuss QgnvmZ dH9c 我有一个类 它从对象图中获取一些依赖项 并在运行时从调用者获取其他依赖项 public cla
  • 如何使用手写笔在 HTML5 画布上绘图

    我使用 onmousedown onmousemove 和 onmouseup 事件在 HTML5 画布对象上使用 JavaScript 进行绘制 一切正常 现在我想用手写笔替换鼠标 Wacom Intuos Pro 因此我用 onpoin