javascript - 指针事件问题:带压力输入的指针取消(笔)
问题描述
提前谢谢你的帮助。我对我遇到的一个问题感到有些困惑。我正在使用 react 和 canvas 在 chrome 中开发一个网络应用程序。这个问题似乎是压力笔输入的PointerEvent问题。
问题:当我开始用我的数位板和笔绘图时,在画了一小段距离后会触发pointercancel 事件,即使仍然用笔施加压力。(使用鼠标时,这按预期工作,没有问题)
为了更好地描述问题,这是正在发生的事情的可视化。(.gif 以白屏开头)
第一行是笔输入的直线,我试图在屏幕上绘制,但正如您所见,即使笔压力仍在施加,它也会突然中断(这是触发pointercancel事件的地方) . 这也显示了在触发事件之前可能的区域大小。
第二个显示,只要我用笔输入停留在一个小区域,pointercancel 就不会触发,但是一旦我尝试离开该区域,就会触发 pointercancel 事件并停止绘制线条。
第三个显示来自鼠标的输入,能够在画布上移动而不会触发指针取消事件。
任何帮助都可以解决这个问题,它看起来确实支持自 chrome 55 以来对这个功能的支持,所以我不确定是什么导致了指针取消被触发。
虽然我认为它与问题并不真正相关,但如果它在这里是项目的代码,重新编写触摸只是为了使其更清晰。它不是很复杂,只是一个简单的画布来测试输入。
画布区域的 HTML 如下(位于 react 组件内):
<div className="session-container">
<canvas ref="canvas" className="canvas"></canvas>
</div>
并且所有在反应组件中的javascript如下:
componentDidMount() {
this.canvas = this.refs.canvas;
this.context = this.canvas.getContext("2d");
this.canvas.addEventListener('pointerdown', this.onDown, false);
this.canvas.addEventListener('pointerup', this.onUp, false);
this.canvas.addEventListener('pointercancel', this.onUp, false);
this.canvas.addEventListener('pointermove', this.onMove, false);
}
onDown(e) {
this.drawing = true;
current.x = e.clientX || e.touches[0].clientX;
current.y = e.clientY || e.touches[0].clientY;
}
onUp(e) {
this.drawing = false;
}
onMove(e) {
if (!this.drawing) return;
this.drawLine(current.x, current.y, e.clientX || e.touches[0].clientX, e.clientY || e.touches[0].clientY, e.pressure, true);
current.x = e.clientX || e.touches[0].clientX;
current.y = e.clientY || e.touches[0].clientY;
}
drawLine(x0, y0, x1, y1, pressure, emit){
this.context.beginPath();
this.context.moveTo(x0, y0);
this.context.lineTo(x1, y1);
this.context.strokeStyle = 'black';
this.context.lineWidth = 2;
this.context.stroke();
this.context.closePath();
}
可以在此处找到组件的完整视图 Gist
解决方案
对于那些有同样问题的人:
解决方案是添加一个 CSS 属性touch-action: none;
它改变了指针事件的行为,这似乎是默认的:使用任何指针作为点击设备,而不是绘图设备
推荐阅读
- java - 将 2 个标签放入 jframe 边框布局的中间
- python - Python:如何在函数调用时评估变量
- javascript - 三.js基本场景未加载
- ios - 如何在 UISegementedControl 的特定部分禁用键盘?
- listbox - “GLib.ListStore”的上下文中不存在名称“find”
- python - Python中的变量如何在内存中表示?
- javascript - 通过javascript更改firestore中的值
- php - 从 PHP 7.2 到 5.3 向后,命令错误
- r - 将某些数据移动到新数据集
- javascript - 当 if 语句为真时如何停止 setinterval 函数