gpt4 book ai didi

javascript - 如何使用光标类型拖动和调整 Canvas 矩形的大小

转载 作者:行者123 更新时间:2023-11-30 08:34:57 25 4
gpt4 key购买 nike

在 Canvas 中,我绘制了一个矩形并完成了拖动和调整大小功能。绘制圆圈以表示调整矩形大小的 handle 。但现在我想使用光标类型进行拖动。

我使用的游标类型如下:

$("#canvas").css({'cursor':'ne-resize'});

这是 jsfiddle 链接。 http://jsfiddle.net/BaliBalo/9HXMG/

var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
rect = {
x: 150,
y: 100,
w: 123,
h: 58
},
handlesSize = 8,
currentHandle = false,
drag = false;

function init() {
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
}

function point(x, y) {
return {
x: x,
y: y
};
}

function dist(p1, p2) {
return Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

function getHandle(mouse) {
if (dist(mouse, point(rect.x, rect.y)) <= handlesSize) return 'topleft';
if (dist(mouse, point(rect.x + rect.w, rect.y)) <= handlesSize) return 'topright';
if (dist(mouse, point(rect.x, rect.y + rect.h)) <= handlesSize) return 'bottomleft';
if (dist(mouse, point(rect.x + rect.w, rect.y + rect.h)) <= handlesSize) return 'bottomright';
if (dist(mouse, point(rect.x + rect.w / 2, rect.y)) <= handlesSize) return 'top';
if (dist(mouse, point(rect.x, rect.y + rect.h / 2)) <= handlesSize) return 'left';
if (dist(mouse, point(rect.x + rect.w / 2, rect.y + rect.h)) <= handlesSize) return 'bottom';
if (dist(mouse, point(rect.x + rect.w, rect.y + rect.h / 2)) <= handlesSize) return 'right';
return false;
}

function mouseDown(e) {
if (currentHandle) drag = true;
draw();
}

function mouseUp() {
drag = false;
currentHandle = false;
draw();
}

function mouseMove(e) {
var previousHandle = currentHandle;
if (!drag) currentHandle = getHandle(point(e.pageX - this.offsetLeft, e.pageY - this.offsetTop));
if (currentHandle && drag) {
var mousePos = point(e.pageX - this.offsetLeft, e.pageY - this.offsetTop);
switch (currentHandle) {
case 'topleft':
rect.w += rect.x - mousePos.x;
rect.h += rect.y - mousePos.y;
rect.x = mousePos.x;
rect.y = mousePos.y;
break;
case 'topright':
rect.w = mousePos.x - rect.x;
rect.h += rect.y - mousePos.y;
rect.y = mousePos.y;
break;
case 'bottomleft':
rect.w += rect.x - mousePos.x;
rect.x = mousePos.x;
rect.h = mousePos.y - rect.y;
break;
case 'bottomright':
rect.w = mousePos.x - rect.x;
rect.h = mousePos.y - rect.y;
break;

case 'top':
rect.h += rect.y - mousePos.y;
rect.y = mousePos.y;
break;

case 'left':
rect.w += rect.x - mousePos.x;
rect.x = mousePos.x;
break;

case 'bottom':
rect.h = mousePos.y - rect.y;
break;

case 'right':
rect.w = mousePos.x - rect.x;
break;
}
}
if (drag || currentHandle != previousHandle) draw();
}

function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'black';
ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
if (currentHandle) {
var posHandle = point(0, 0);
switch (currentHandle) {
case 'topleft':
posHandle.x = rect.x;
posHandle.y = rect.y;
break;
case 'topright':
posHandle.x = rect.x + rect.w;
posHandle.y = rect.y;
break;
case 'bottomleft':
posHandle.x = rect.x;
posHandle.y = rect.y + rect.h;
break;
case 'bottomright':
posHandle.x = rect.x + rect.w;
posHandle.y = rect.y + rect.h;
break;
case 'top':
posHandle.x = rect.x + rect.w / 2;
posHandle.y = rect.y;
break;
case 'left':
posHandle.x = rect.x;
posHandle.y = rect.y + rect.h / 2;
break;
case 'bottom':
posHandle.x = rect.x + rect.w / 2;
posHandle.y = rect.y + rect.h;
break;
case 'right':
posHandle.x = rect.x + rect.w;
posHandle.y = rect.y + rect.h / 2;
break;
}
ctx.globalCompositeOperation = 'xor';
ctx.beginPath();
ctx.arc(posHandle.x, posHandle.y, handlesSize, 0, 2 * Math.PI);
ctx.fill();
ctx.globalCompositeOperation = 'source-over';
}
}

init();
draw();
<canvas id="canvas" width="500" height="500"></canvas>

最佳答案

draw 函数的 swicth 语句中添加所需的光标类型:

var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
rect = {
x: 150,
y: 100,
w: 123,
h: 58
},
handlesSize = 8,
currentHandle = false,
drag = false;

function init() {
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
}

function point(x, y) {
return {
x: x,
y: y
};
}

function dist(p1, p2) {
return Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

function getHandle(mouse) {
if (dist(mouse, point(rect.x, rect.y)) <= handlesSize) return 'topleft';
if (dist(mouse, point(rect.x + rect.w, rect.y)) <= handlesSize) return 'topright';
if (dist(mouse, point(rect.x, rect.y + rect.h)) <= handlesSize) return 'bottomleft';
if (dist(mouse, point(rect.x + rect.w, rect.y + rect.h)) <= handlesSize) return 'bottomright';
if (dist(mouse, point(rect.x + rect.w / 2, rect.y)) <= handlesSize) return 'top';
if (dist(mouse, point(rect.x, rect.y + rect.h / 2)) <= handlesSize) return 'left';
if (dist(mouse, point(rect.x + rect.w / 2, rect.y + rect.h)) <= handlesSize) return 'bottom';
if (dist(mouse, point(rect.x + rect.w, rect.y + rect.h / 2)) <= handlesSize) return 'right';
return false;
}

function mouseDown(e) {
if (currentHandle) drag = true;
draw();
}

function mouseUp() {
drag = false;
currentHandle = false;
draw();
}

function mouseMove(e) {
var previousHandle = currentHandle;
if (!drag) currentHandle = getHandle(point(e.pageX - this.offsetLeft, e.pageY - this.offsetTop));
if (currentHandle && drag) {
var mousePos = point(e.pageX - this.offsetLeft, e.pageY - this.offsetTop);
switch (currentHandle) {
case 'topleft':
rect.w += rect.x - mousePos.x;
rect.h += rect.y - mousePos.y;
rect.x = mousePos.x;
rect.y = mousePos.y;
break;
case 'topright':
rect.w = mousePos.x - rect.x;
rect.h += rect.y - mousePos.y;
rect.y = mousePos.y;
break;
case 'bottomleft':
rect.w += rect.x - mousePos.x;
rect.x = mousePos.x;
rect.h = mousePos.y - rect.y;
break;
case 'bottomright':
rect.w = mousePos.x - rect.x;
rect.h = mousePos.y - rect.y;
break;

case 'top':
rect.h += rect.y - mousePos.y;
rect.y = mousePos.y;
break;

case 'left':
rect.w += rect.x - mousePos.x;
rect.x = mousePos.x;
break;

case 'bottom':
rect.h = mousePos.y - rect.y;
break;

case 'right':
rect.w = mousePos.x - rect.x;
break;
}
}
if (drag || currentHandle != previousHandle) draw();


}

function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'black';
ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
if (currentHandle) {
var posHandle = point(0, 0);
var dir;
switch (currentHandle) {
case 'topleft':
dir={x:rect.w>0?'w':'e',y:rect.h>0?'n':'s'};
canvas.style.cursor= dir.y+dir.x+'-resize';
break;
case 'topright':
dir={x:rect.w>0?'e':'w',y:rect.h>0?'n':'s'};
canvas.style.cursor= dir.y+dir.x+'-resize';
break;
case 'bottomleft':
dir={x:rect.w>0?'w':'e',y:rect.h>0?'s':'n'};
canvas.style.cursor= dir.y+dir.x+'-resize';
break;
case 'bottomright':
dir={x:rect.w>0?'e':'w',y:rect.h>0?'s':'n'};
canvas.style.cursor= dir.y+dir.x+'-resize';
break;
case 'top':
canvas.style.cursor= (rect.h>0?'n':'s')+'-resize';
break;
case 'left':
canvas.style.cursor= (rect.w>0?'w':'e')+'-resize';
break;
case 'bottom':
canvas.style.cursor= (rect.h>0?'s':'n')+'-resize';
break;
case 'right':
canvas.style.cursor= (rect.w>0?'e':'w')+'-resize';
break;
}
}else canvas.style.cursor='';
}

init();
draw();
<canvas id="canvas" width="500" height="500"></canvas>

关于javascript - 如何使用光标类型拖动和调整 Canvas 矩形的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32390028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com