javascript - 当键码处于活动状态时,用鼠标绘制 Javascript 画布
问题描述
我有一个绘图应用程序,可以用鼠标在画布上画线。目前它正在工作。但我想将鼠标移动绑定到键盘按下事件,以避免在画布上意外绘制。以下是一个最小的示例代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>draw</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<canvas id="canvas" width="800" height="600" style="border:solid 1px;margin:0;padding:0;"></canvas>
</body>
</html>
<script type="text/javascript">
var rectcanvas, context;
var dragging = false;
var dragStartLocation;
var dragStopLocation;
function getCanvasCoordinates(event) {
var x = event.clientX - canvas.getBoundingClientRect().left,
y = event.clientY - canvas.getBoundingClientRect().top;
return {x: x, y: y};
}
function takeSnapshot() {
snapshot = context.getImageData(0, 0, canvas.width, canvas.height);
}
function restoreSnapshot() {
context.putImageData(snapshot, 0, 0);
}
function drawLine(position) {
context.beginPath();
context.moveTo(dragStartLocation.x, dragStartLocation.y);
context.lineTo(position.x, position.y);
context.stroke();
}
function dragStart(event) {
dragging = true;
dragStartLocation = getCanvasCoordinates(event);
takeSnapshot();
}
function drag(event) {
var position;
if (dragging === true) {
restoreSnapshot();
position = getCanvasCoordinates(event);
drawLine(position);
}
}
function dragStop(event) {
dragging = false;
restoreSnapshot();
var position = getCanvasCoordinates(event);
drawLine(position);
}
function init() {
canvas = document.getElementById("canvas");
context = canvas.getContext('2d');
context.strokeStyle = 'purple';
context.lineWidth = 6;
context.lineCap = 'round';
canvas.addEventListener('mousedown', dragStart, false);
canvas.addEventListener('mousemove', drag, false);
canvas.addEventListener('mouseup', dragStop, false);
}
window.addEventListener('load', init, false);
</script>
我想强制用户在 mousedown、mousemove 或 mouseup 事件期间按下一个键。我尝试了该dragstart
事件,但无法使其正常工作。
function dragStart(event) {
switch(event.keyCode) {
case 16:
var dragStartLocation = getCanvasCoordinates(event);
var x = dragStartLocation.x;
var y = dragStartLocation.y;
alert(x + " | " + y);
break;
case 17:
var dragStartLocation = getCanvasCoordinates(event);
var x = dragStartLocation.x;
var y = dragStartLocation.y;
alert(x + " | " + y);
break;
case 65:
var dragStartLocation = getCanvasCoordinates(event);
var x = dragStartLocation.x;
var y = dragStartLocation.y;
alert(x + " | " + y);
break
}
}
解决方案
推荐阅读
- reactjs - React Native 在深度链接时省略了井号键
- python - 使用自定义 Python 在 Yarn 上的 Spark 在客户端模式下失败
- ios - iOS Swift 批量请求
- r - 将函数作为输入并在调用时使其表达式可见的函数
- angular - 如何将图像添加到幻灯片
- r - 如何在 google colab for R 中加载 csv 文件?
- vb.net - 在 VB.Net 中获取索引最高值
- aws-lambda - 为 AWS Lambda 添加权限的正确 terraform 语法
- asp.net-core - 如何修复:在 Azure Devops 构建管道实体框架不生成 SQL 脚本
- github - 无法在 Cocoapods 上推送自定义框架