javascript - 如何显示用户的矩形的外观?

标签 javascript jquery canvas html5-canvas rectangles

我试图通过单击、移动鼠标​​并再次单击在 Canvas 上绘制一个矩形。我应该如何在第一次单击后跟随用户的光标并在 Canvas 上显示填充矩形的预览,以了解形状在任何给定坐标处的外观。

到目前为止,我可以成功创建矩形,而无需显示矩形在任何坐标处的外观。

这是到目前为止的代码:

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

var canvasOffset = $("#canvas").offset();
var offsetX = canvasOffset.left;
var offsetY = canvasOffset.top;

var startX;
var startY;
var drawingShape = false;

//function getMousePos(canvas, ev) {
//var rect = canvas.getBoundingClientRect();
//}

//canvas.addEventListener('mousemove', function (ev) {
//var mousePos = getMousePos(canvas, ev);
//} 

function setMousePosition(e) {
    mouseX = parseInt(e.clientX - offsetX);
    mouseY = parseInt(e.clientY - offsetY);
    $("#downlog").html("Down: " + mouseX + " / " + mouseY);


    if (drawingShape) {
        drawingShape = false;
        ctx.beginPath();
        ctx.fillStyle = "#FF0000";
        ctx.rect(startX, startY, mouseX - startX, mouseY - startY);
        ctx.fill();

    } else {
        drawingShape = true;
        startX = mouseX;
        startY = mouseY;
    }
}

$("#canvas").mousedown(function (e) {
    setMousePosition(e);
});

我尝试使用事件监听器来监听鼠标移动,正如我在 HTML5 教程 ( http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ ) 中看到的那样,但我不确定如何将其与现有代码连接起来。

最佳答案

您可以在开始绘制时存储图像,并在每次想要编辑时重新加载它。
这是我基于您的代码的快速实现,它需要一些优化(也许只捕获您计划绘制的区域):

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

var canvasOffset = $("#canvas").offset();
var offsetX = canvasOffset.left;
var offsetY = canvasOffset.top;

var startX;
var startY;
var drawingShape = false;
var oldImage;

canvas.addEventListener('mousemove', function(e){
  if(drawingShape){
    ctx.putImageData(oldImage,0,0);
    mouseX = parseInt(e.clientX - offsetX, 10);
    mouseY = parseInt(e.clientY - offsetY, 10);

    ctx.beginPath();
    ctx.fillStyle = "#FF0000";
    ctx.rect(startX, startY, mouseX - startX, mouseY - startY);
    ctx.fill();
  }
});

function setMousePosition(e) {
mouseX = parseInt(e.clientX - offsetX, 10);
mouseY = parseInt(e.clientY - offsetY, 10);
$("#downlog").html("Down: " + mouseX + " / " + mouseY);


  if (drawingShape) {
    drawingShape = false;
    ctx.beginPath();
    ctx.fillStyle = "#FF0000";
    ctx.rect(startX, startY, mouseX - startX, mouseY - startY);
    ctx.fill();

  } else {
    drawingShape = true;
    startX = mouseX;
    startY = mouseY;
    oldImage = ctx.getImageData(0,0,canvas.width,canvas.height);
  }
}

$("#canvas").mousedown(function (e) {
    setMousePosition(e);
});

注意我们如何在鼠标按下事件中存储图像数据并在每次鼠标移动时检索它

关于javascript - 如何显示用户的矩形的外观?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459919/

相关文章:

jquery - Columndefs 不工作数据表

android - 为什么 Canvas::drawArc 方法绘制的角度不正确?

javascript - 用于动态元素和 ajax 的 jQuery 验证插件

javascript - 如何在 React/JS 中单击不同按钮时将 Formcontrol 切换为禁用或启用?

javascript - 将日期格式从 mm/dd/yy 更改为 dd/mm/yy

javascript - 将 javascript 变量传递给外部 php 文件

javascript - 在 jquery 中验证 Bootstrap 弹出窗口

javascript - 将 jQuery 函数传递给高阶函数

javascript - 多个 div/canvas 之间的流动文本

HTML5 Canvas 橡皮擦