I’ve modified a page where I can drag and drop images onto a canvas. It does everything I want except for one. I’ve tried multiple methods (including scripts, e.g. Kinetic and Raphael, which I still think may be the route to go) but have dead ended:
Once the image is dropped, I can’t drag it on the canvas to a new position.
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);
}
Here is a JSFiddle that I used as my initial start point – http://fiddle.jshell.net/gael/GF96n/4/ (drag the JSFiddle logo onto the canvas and then try to move it). I’ve since added CSS, tabs, content, etc. to my almost working page. The function I don’t want to lose is the ability to drag the single image multiple times (clone) onto the canvas.
Any ideas/examples/pointers on how to create this functionality?
You need to do a couple of changes to your code, instead of drawing the image immediately to the canvas, you need to keep track of all images dropped.
imagesOnCanvaswill be filled with all images dropped.You also need an animation loop, which will go through all images in
imagesOnCanvasand draw them sequentially.requestAnimationFrameis used to achieve this.Next you will have to monitor
mousedownevents on canvas, and if the event occurs on an image thestartMoveaction can be calledThe
isPointInRangefunction returns true if the mouse event occurred on an image objectOnce ‘move mode’ is active, the x/y coordinates of the object are changed to reflect the new mouse position
Working example here:
http://jsfiddle.net/XU2a3/41/