我最近一直在学习HTML画布,并制作了一个简单的绘图应用程序,可在桌面上完美运行。但是在移动设备上,我无法画一条连续的线,只能画单个点。知道我在做什么错吗?链接到我的Codepen版本
let color = "black";
let strokeSize = 10;
function changeColorAndSize(data, width) {
color = data;
strokeSize = width;
}
window.addEventListener("load", () => {
const canvas = document.querySelector("#canvas");
const ctx = canvas.getContext("2d");
//resizing
canvas.height = window.innerHeight;
canvas.width = window.innerWidth;
//variables
let painting = false;
//functions
function startPosition(e) {
painting = true;
draw(e);
}
function endPosition() {
painting = false;
ctx.beginPath();
}
function draw(e) {
if (!painting) {
return;
}
e.preventDefault();
ctx.lineWidth = strokeSize;
ctx.lineCap = "round";
ctx.lineTo(e.clientX, e.clientY);
ctx.stroke();
ctx.strokeStyle = color;
ctx.beginPath();
ctx.moveTo(e.clientX, e.clientY);
}
//event listeners
canvas.addEventListener("mousedown", startPosition);
canvas.addEventListener("touchstart", startPosition);
canvas.addEventListener("mouseup", endPosition);
canvas.addEventListener("touchend", endPosition);
canvas.addEventListener("mousemove", draw);
canvas.addEventListener("touchmove", draw);
});
我不确定您的应用程序在移动应用程序上的含义是什么,因此我将假设您的应用程序没有绘制。
我的答案基于here回答的问题。它采用touchmove事件,并以相同的方式基于触摸clientX
和clientX
手动创建带有clientY
的mousemove事件。
这里是新的code pen
下面是更改的代码:
let color = "black";
let strokeSize = 10;
function changeColorAndSize(data, width) {
color = data;
strokeSize = width;
}
window.addEventListener("load", () => {
const canvas = document.querySelector("#canvas");
const ctx = canvas.getContext("2d");
//resizing
canvas.height = window.innerHeight;
canvas.width = window.innerWidth;
//variables
let painting = false;
//functions
function startPosition(e) {
painting = true;
draw(e);
}
function endPosition() {
painting = false;
ctx.beginPath();
}
function draw(e) {
if (!painting) {
return;
}
e.preventDefault();
e.stopPropagation();
ctx.lineWidth = strokeSize;
ctx.lineCap = "round";
ctx.lineTo(e.clientX, e.clientY);
ctx.stroke();
ctx.strokeStyle = color;
ctx.beginPath();
ctx.moveTo(e.clientX, e.clientY);
}
//event listeners
canvas.addEventListener("mousedown", startPosition);
canvas.addEventListener("touchstart", startPosition);
canvas.addEventListener("mouseup", endPosition);
canvas.addEventListener("touchend", endPosition);
canvas.addEventListener("mousemove", draw);
canvas.addEventListener("touchmove", function (e) {
var touch = e.touches[0];
var mouseEvent = new MouseEvent("mousemove", {
clientX: touch.clientX,
clientY: touch.clientY
});
draw(mouseEvent);
}, false);
});
body{
margin:0;
padding:0;
}
#colorButtonBox{
position:absolute;
background:rgb(210,210,210);
padding:5px;
margin:5px;
border-radius:10px;
bottom:0;
}
#colorButton {
transition: .1s linear;
position: relative;
float:left;
margin:5px;
border-radius:5px;
width: 40px;
height: 40px;
z-index: 3;
}
#eraserButton {
transition: .1s linear;
position: relative;
float:left;
margin:5px;
border-radius:50%;
width: 40px;
height: 40px;
z-index: 3;
background:white;
}
#eraserButton:hover {
width:30px;
height:30px;
margin:10px;
}
#colorButton:hover {
transition: .1s linear;
width:45px;
height:45px;
margin:2.5px;
}
.black {
background:black;
}
.blue {
background:blue;
}
.red {
background:red;
}
.green {
background:green;
}
.yellow {
background:yellow;
}
<META name="viewport" content="initial-scale=0.66, user-scalable=no">
<body>
<div id="colorButtonBox">
<div id="colorButton" class="black" onclick='changeColorAndSize("black",10)'></div>
<div id="colorButton" class="red" onclick="changeColorAndSize('red',10)"></div>
<div id="colorButton" class="green" onclick="changeColorAndSize('green',10)"></div>
<div id="colorButton" class="blue" onclick="changeColorAndSize('blue',10)"></div>
<div id="colorButton" class="yellow" onclick="changeColorAndSize('yellow',10)"></div>
<div id="eraserButton" onclick="changeColorAndSize('white',100)"></div>
</div>
<canvas id="canvas"></canvas>
</body>
希望对您有帮助,如果您还有其他问题,请随时提出:)
mousemove
和touchmove
事件具有不同的clientX
和clientY
。对于mousemove事件(e):
X = e.clientX和Y = e.clientY
并且对于touchmove事件:
X = e.touches [0] .clientX和Y = e.touches [0] .clientY
因此,您需要使用条件语句来找到事件的类型,并相应地使用find X和Y。可以在下面和codepen
上找到更新的代码let color = "black";
let strokeSize = 10;
function changeColorAndSize(data, width) {
color = data;
strokeSize = width;
}
window.addEventListener("load", () => {
const canvas = document.querySelector("#canvas");
const ctx = canvas.getContext("2d");
//resizing
canvas.height = window.innerHeight;
canvas.width = window.innerWidth;
//variables
let painting = false;
//functions
function startPosition(e) {
painting = true;
draw(e);
}
function endPosition() {
painting = false;
ctx.beginPath();
}
function draw(e) {
if (!painting) {
return;
}
e.preventDefault();
ctx.lineWidth = strokeSize;
ctx.lineCap = "round";
// ctx.lineTo(e.clientX, e.clientY);
if (e.type == 'touchmove'){
ctx.lineTo(e.touches[0].clientX, e.touches[0].clientY);
} else if (e.type == 'mousemove'){
ctx.lineTo(e.clientX, e.clientY);
}
ctx.stroke();
ctx.strokeStyle = color;
ctx.beginPath();
// ctx.moveTo(e.clientX, e.clientY);
if (e.type == 'touchmove'){
ctx.moveTo(e.touches[0].clientX, e.touches[0].clientY);
} else if (e.type == 'mousemove'){
ctx.moveTo(e.clientX, e.clientY);
}
}
//event listeners
canvas.addEventListener("mousedown", startPosition);
canvas.addEventListener("touchstart", startPosition);
canvas.addEventListener("mouseup", endPosition);
canvas.addEventListener("touchend", endPosition);
canvas.addEventListener("mousemove", draw);
canvas.addEventListener("touchmove", draw);
});
body{
margin:0;
padding:0;
}
#colorButtonBox{
position:absolute;
background:rgb(210,210,210);
padding:5px;
margin:5px;
border-radius:10px;
bottom:0;
}
#colorButton {
transition: .1s linear;
position: relative;
float:left;
margin:5px;
border-radius:5px;
width: 40px;
height: 40px;
z-index: 3;
}
#eraserButton {
transition: .1s linear;
position: relative;
float:left;
margin:5px;
border-radius:50%;
width: 40px;
height: 40px;
z-index: 3;
background:white;
}
#eraserButton:hover {
width:30px;
height:30px;
margin:10px;
}
#colorButton:hover {
transition: .1s linear;
width:45px;
height:45px;
margin:2.5px;
}
.black {
background:black;
}
.blue {
background:blue;
}
.red {
background:red;
}
.green {
background:green;
}
.yellow {
background:yellow;
}
<META name="viewport" content="initial-scale=0.66, user-scalable=no">
<body>
<div id="colorButtonBox">
<div id="colorButton" class="black" onclick='changeColorAndSize("black",10)'></div>
<div id="colorButton" class="red" onclick="changeColorAndSize('red',10)"></div>
<div id="colorButton" class="green" onclick="changeColorAndSize('green',10)"></div>
<div id="colorButton" class="blue" onclick="changeColorAndSize('blue',10)"></div>
<div id="colorButton" class="yellow" onclick="changeColorAndSize('yellow',10)"></div>
<div id="eraserButton" onclick="changeColorAndSize('white',100)"></div>
</div>
<canvas id="canvas"></canvas>
</body>