我正在开发一个类似画图的功能,用户可以画线,但在我的设备(安卓手机)上,touchmove事件响应非常慢,导致线条变得锯齿状。只要我将设备通过USB调试连接到电脑并打开Chrome DevTools,一切都正常了。在桌面版Chrome中的手机模拟器上没有任何问题。
这里是一个截图。内圆是用缓慢的触摸事件绘制的,而外圆是我将设备连接到电脑后绘制的。 这是另一张截图,显示了“touchmove”事件调用之间的持续时间。顶部部分(绿色数值)是在开发工具打开时发生的,底部部分(红色数值)是在关闭后发生的。
这里是一个截图。内圆是用缓慢的触摸事件绘制的,而外圆是我将设备连接到电脑后绘制的。 这是另一张截图,显示了“touchmove”事件调用之间的持续时间。顶部部分(绿色数值)是在开发工具打开时发生的,底部部分(红色数值)是在关闭后发生的。
代码:
function DrawingCanvas(/* ... */) {
// ...
const handleTouchMove = (event) => {
handleMouseMove(event.touches[0])
}
const handleMouseMove = ({ clientX, clientY }) => {
if (!isDrawing) {
return
}
const canvasRect = canvas.getBoundingClientRect()
const x = clientX - canvasRect.x
const y = clientY - canvasRect.y
currentPath.current.addPoint([x, y])
update()
}
const update = () => {
clearCanvas()
drawPath()
}
// ...
useEffect(() => {
const drawingCanvas = drawingCanvasRef.current
// ...
drawingCanvas.addEventListener("touchstart", handleDrawStart)
drawingCanvas.addEventListener("touchend", handleDrawEnd)
drawingCanvas.addEventListener("touchcancel", handleDrawEnd)
drawingCanvas.addEventListener("touchmove", handleTouchMove)
drawingCanvas.addEventListener("mousedown", handleDrawStart)
drawingCanvas.addEventListener("mouseup", handleDrawEnd)
drawingCanvas.addEventListener("mousemove", handleMouseMove)
return () => {
drawingCanvas.removeEventListener("touchstart", handleDrawStart)
drawingCanvas.removeEventListener("touchmove", handleTouchMove)
drawingCanvas.removeEventListener("touchend", handleDrawEnd)
drawingCanvas.removeEventListener("touchcancel", handleDrawEnd)
drawingCanvas.removeEventListener("mousedown", handleDrawStart)
drawingCanvas.removeEventListener("mouseup", handleDrawEnd)
drawingCanvas.removeEventListener("mousemove", handleMouseMove)
}
})
return <canvas /* ... */ />
}
有人知道如何修复这个问题吗?
你可以在网站上自行测试:https://www.easymeme69.com/editor