首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绘画应用程序在移动设备上不起作用。为什么会这样呢?

绘画应用程序在移动设备上不起作用。为什么会这样呢?
EN

Stack Overflow用户
提问于 2021-07-20 21:34:45
回答 1查看 53关注 0票数 0

我有这个绘画应用程序,虽然它可以在桌面浏览器上工作,但它不能在移动设备上工作。我为移动事件添加了事件侦听器,移动设备可以理解这些事件,但什么也没有发生。有什么想法可以解决这个问题吗?

这是该应用程序的链接:https://codepen.io/sp2012/pen/oNWeZBx

代码如下:

HTML

代码语言:javascript
运行
复制
<input type="color"  class="js-color-picker  color-picker">
<input type="range" class="js-line-range" min="1" max="72" value="1">
<label class="js-range-value">1</label>Px
<canvas class="js-paint  paint-canvas" width="200" height="200"></canvas>

CSS

代码语言:javascript
运行
复制
.paint-canvas {
  border: 1px black solid;
  display: block;
  margin: 1rem;
}

.color-picker {
  margin: 1rem 1rem 0 1rem;
}

JS

代码语言:javascript
运行
复制
const paintCanvas = document.querySelector( '.js-paint' );
const context = paintCanvas.getContext( '2d' );
context.lineCap = 'round';

const colorPicker = document.querySelector( '.js-color-picker');

colorPicker.addEventListener( 'change', event => {
    context.strokeStyle = event.target.value; 
} );

const lineWidthRange = document.querySelector( '.js-line-range' );
const lineWidthLabel = document.querySelector( '.js-range-value' );

lineWidthRange.addEventListener( 'input', event => {
    const width = event.target.value;
    lineWidthLabel.innerHTML = width;
    context.lineWidth = width;
} );

let x = 0, y = 0;
let isMouseDown = false;

const stopDrawing = () => { isMouseDown = false; }
const startDrawing = event => {
    isMouseDown = true;   
   [x, y] = [event.offsetX, event.offsetY];  
}
const drawLine = event => {
    if ( isMouseDown ) {
        const newX = event.offsetX;
        const newY = event.offsetY;
        context.beginPath();
        context.moveTo( x, y );
        context.lineTo( newX, newY );
        context.stroke();
        //[x, y] = [newX, newY];
        x = newX;
        y = newY;
    }
}

paintCanvas.addEventListener( 'mousedown', startDrawing );
paintCanvas.addEventListener( 'mousemove', drawLine );
paintCanvas.addEventListener( 'mouseup', stopDrawing );
paintCanvas.addEventListener( 'mouseout', stopDrawing );

paintCanvas.addEventListener("touchstart", startDrawing);
paintCanvas.addEventListener("touchend", stopDrawing);
paintCanvas.addEventListener("touchcancel", stopDrawing);
paintCanvas.addEventListener("touchmove", drawLine);
EN

回答 1

Stack Overflow用户

发布于 2021-07-20 22:03:40

这里没有专家,但是通过在startDrawing中添加console.table(event)语句,我们可以看到(使用浏览器开发工具)在桌面模式下接收MouseEvent对象,而在移动模式下接收,并且后者没有offsetX/offsetY属性。

看起来你可以使用event.touches或者event.targetTouches。这两个对象都包含一个TouchList对象,它是包含坐标的对象的一个类似数组的集合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68455833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档