[英]Drawing multiple rectangles on canvas without clearing the back image
我正在尝试在画布上绘制多个矩形。 除了鼠标移动时不清除矩形,我能够做到这一点。 当我尝试使用clearRect
清除矩形时,画布上的背面图像也会被清除。 所以我已经注释掉//ctx.clearRect(0, 0, canvas.width, canvas.height);
在下面的代码中
$(function(){ var canvas = document.getElementById('myCanvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); ctx.fillText("Sample String", 20, 50); } var ctx = canvas.getContext('2d'); //Variables var canvasx = $(canvas).offset().left; var canvasy = $(canvas).offset().top; var last_mousex = last_mousey = 0; var mousex = mousey = 0; var mousedown = false; //Mousedown $(canvas).on('mousedown', function (e) { last_mousex = parseInt(e.clientX - canvasx); last_mousey = parseInt(e.clientY - canvasy); mousedown = true; }); //Mouseup $(canvas).on('mouseup', function (e) { mousedown = false; }); //Mousemove $(canvas).on('mousemove', function (e) { mousex = parseInt(e.clientX - canvasx); mousey = parseInt(e.clientY - canvasy); if (mousedown) { //ctx.clearRect(0, 0, canvas.width, canvas.height); var width = mousex - last_mousex; var height = mousey - last_mousey; ctx.beginPath(); ctx.rect(last_mousex, last_mousey, width, height); ctx.strokeStyle = 'black'; ctx.lineWidth = 1; ctx.stroke(); } //Output $('#results').html('current: ' + mousex + ', ' + mousey + '<br/>last: ' + last_mousex + ', ' + last_mousey + '<br/>mousedown: ' + mousedown); }); })
canvas { border: 1px solid black; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <h3> Use mouse to draw multiple rectangles with in the canvas </h3> <canvas id="myCanvas"></canvas> <div id="results"> </div>
您的错误是您清除了所有画布:
ctx.clearRect(0, 0, canvas.width, canvas.height);
而不是只清除您之前绘制的区域:
ctx.clearRect(prev_x-1, prev_y-1, prev_w+2, prev_h+2);
我在这里写了基本的想法,但是您需要添加一些代码来清除区域,具体取决于鼠标的方向,然后移动到(尝试将鼠标移到每个角,然后看看会发生什么)。
$("#clear").click(function(){ var canvas = document.getElementById('myCanvas'); var ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillText("Sample String", 20, 50); }); $(function(){ var canvas = document.getElementById('myCanvas'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); ctx.fillText("Sample String", 20, 50); } var ctx = canvas.getContext('2d'); //Variables var canvasx = $(canvas).offset().left; var canvasy = $(canvas).offset().top; var last_mousex = last_mousey = w = h = 0; var prev_x = prev_y = prev_w = prev_h = 0; var mousex = mousey = 0; var mousedown = false; //Mousedown $(canvas).on('mousedown', function (e) { last_mousex = parseInt(e.clientX - canvasx); last_mousey = parseInt(e.clientY - canvasy); mousedown = true; }); //Mouseup $(canvas).on('mouseup', function (e) { w = h = 0; mousedown = false; }); //Mousemove $(canvas).on('mousemove', function (e) { mousex = parseInt(e.clientX - canvasx); mousey = parseInt(e.clientY - canvasy); if (mousedown) { prev_x = last_mousex; prev_y = last_mousey; prev_w = w; prev_h = h; ctx.clearRect(prev_x-1, prev_y-1, prev_w+2, prev_h+2); w = mousex - last_mousex; h = mousey - last_mousey; ctx.beginPath(); ctx.rect(last_mousex, last_mousey, w, h); ctx.strokeStyle = 'black'; ctx.lineWidth = 1; ctx.stroke(); } //Output $('#results').html('current: ' + mousex + ', ' + mousey + '<br/>last: ' + last_mousex + ', ' + last_mousey + '<br/>mousedown: ' + mousedown); }); })
canvas { border: 1px solid black; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <h3> Use mouse to draw multiple rectangles with in the canvas </h3> <button id="clear">clear</button> <br /> <canvas id="myCanvas"></canvas> <div id="results"> </div>
我认为您可以采用另一种方法
通过仅使用mousedown事件,然后将所有矩形保存到数组变量
然后,您可以使用保存的变量清除并重新绘制整个画布
var shapes = [];
canva.addEventListener('mousedown', mouseDownListener);
class Rectangle() {
public ctx, x, y, w, h;
public Rectangle(ctx, x, y, w, h) {
this.ctx = ctx;
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
public draw() {
// draw using ctx here
}
}
function mouseDownListener() {
// create rectable
var rectangle = new Rectangle(ctx, x, y, width, height);
// save rectangle to an array
shapes.push(rectangle);
// redraw canvas
redraw();
}
function redraw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// draw all rectangle
shapes.forEach(function(shape) {
// draw shape
shape.draw();
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.