我修改了一个页面,我可以将图片拖放到画布上。它做了我想要的一切,除了一个。我尝试了多种方法(包括脚本,例如Kinetic和Raphael,我仍然认为它可能是走的路),但已经死了:
图片一旦删除,我就无法将它在画布上拖动到新位置。
function drag(e)
{
//store the position of the mouse relativly to the image position
e.dataTransfer.setData("mouse_position_x",e.clientX - e.target.offsetLeft );
e.dataTransfer.setData("mouse_position_y",e.clientY - e.target.offsetTop );
e.dataTransfer.setData("image_id",e.target.id);
}
function drop(e)
{
e.preventDefault();
var image = document.getElementById( e.dataTransfer.getData("image_id") );
var mouse_position_x = e.dataTransfer.getData("mouse_position_x");
var mouse_position_y = e.dataTransfer.getData("mouse_position_y");
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
// the image is drawn on the canvas at the position of the mouse when we lifted the mouse button
ctx.drawImage( image , e.clientX - canvas.offsetLeft - mouse_position_x , e.clientY - canvas.offsetTop - mouse_position_y );
}
function convertCanvasToImage() {
var canvas = document.getElementById('canvas');
var image_src = canvas.toDataURL("image/png");
window.open(image_src);
}
这是我用作初始起点的JSFiddle - http://fiddle.jshell.net/gael/GF96n/4/(将JSFiddle徽标拖到画布上,然后尝试移动它)。我已经将CSS,标签,内容等添加到我几乎工作的页面中了。我不想失去的功能是能够将单个图像多次(克隆)拖到画布上。
有关如何创建此功能的任何想法/示例/指示?
答案 0 :(得分:6)
您需要对代码进行一些更改,而不是立即将图像绘制到画布上,您需要跟踪所有丢弃的图像。 imagesOnCanvas
将填充所有丢弃的图像。
var imagesOnCanvas = [];
function drop(e)
{
e.preventDefault();
var image = document.getElementById( e.dataTransfer.getData("image_id") );
var mouse_position_x = e.dataTransfer.getData("mouse_position_x");
var mouse_position_y = e.dataTransfer.getData("mouse_position_y");
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
imagesOnCanvas.push({
context: ctx,
image: image,
x:e.clientX - canvas.offsetLeft - mouse_position_x,
y:e.clientY - canvas.offsetTop - mouse_position_y,
width: image.offsetWidth,
height: image.offsetHeight
});
}
您还需要一个动画循环,它将遍历imagesOnCanvas
中的所有图像并按顺序绘制它们。 requestAnimationFrame
用于实现此目的。
function renderScene() {
requestAnimationFrame(renderScene);
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.clearRect(0,0,
canvas.width,
canvas.height
);
for(var x = 0,len = imagesOnCanvas.length; x < len; x++) {
var obj = imagesOnCanvas[x];
obj.context.drawImage(obj.image,obj.x,obj.y);
}
}
requestAnimationFrame(renderScene);
接下来,您必须在画布上监视mousedown
个事件,如果事件发生在图像上,则可以调用startMove
个动作
canvas.onmousedown = function(e) {
var downX = e.offsetX,downY = e.offsetY;
// scan images on canvas to determine if event hit an object
for(var x = 0,len = imagesOnCanvas.length; x < len; x++) {
var obj = imagesOnCanvas[x];
if(!isPointInRange(downX,downY,obj)) {
continue;
}
startMove(obj,downX,downY);
break;
}
}
如果鼠标事件发生在图像对象上,isPointInRange
函数返回true
function isPointInRange(x,y,obj) {
return !(x < obj.x ||
x > obj.x + obj.width ||
y < obj.y ||
y > obj.y + obj.height);
}
一旦'移动模式'处于活动状态,对象的x / y坐标就会改变以反映新的鼠标位置
function startMove(obj,downX,downY) {
var canvas = document.getElementById('canvas');
var origX = obj.x, origY = obj.y;
canvas.onmousemove = function(e) {
var moveX = e.offsetX, moveY = e.offsetY;
var diffX = moveX-downX, diffY = moveY-downY;
obj.x = origX+diffX;
obj.y = origY+diffY;
}
canvas.onmouseup = function() {
// stop moving
canvas.onmousemove = function(){};
}
}
这里的工作示例:
答案 1 :(得分:0)
我知道它已经有2年了,但是我会试一试......在@lostsource提供的答案中,Opera浏览器不支持dataTransfer对象,并且jsfiddle无效。我迫切需要那个答案,这就是我一直在寻找的,但它不起作用!