soltar example ejemplos drop create arrastrar and javascript html5 canvas drag-and-drop

javascript - ejemplos - drag and drop html5 example



Arrastre y suelte varios objetos en Canvas HTML5 (1)

Al mover 1 (o más) formas, el procedimiento es:

Crea objetos que definan cada forma:

// an array of objects that define different rectangles var rects=[]; rects.push({x:75-15,y:50-15,width:30,height:30,fill:"#444444",isDragging:false}); rects.push({x:75-25,y:50-25,width:30,height:30,fill:"#ff550d",isDragging:false}); rects.push({x:75-35,y:50-35,width:30,height:30,fill:"#800080",isDragging:false}); rects.push({x:75-45,y:50-45,width:30,height:30,fill:"#0c64e8",isDragging:false});

En mousedown:

  • obtener la posición actual del mouse
  • establece el indicador isDragging en cualquier forma que esté debajo del mouse
  • guardar la posición actual del mouse

En mousemove:

  • obtener la posición actual del mouse
  • calcular cuánto ha movido el mouse (distance = newMousePosition-oldMousePosition)
  • agregue la distancia a la posición de cualquier forma que se arrastre
  • guardar la posición actual del mouse
  • redibujar la escena con formas en sus nuevas posiciones

En mouseup:

  • borrar todas isDragging banderas de isDragging

Aquí hay un código anotado y una demo: http://jsfiddle.net/m1erickson/qm9Eb/

<!doctype html> <html> <head> <link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> <style> body{ background-color: ivory; } #canvas{border:1px solid red;} </style> <script> window.onload=function(){ // get canvas related references var canvas=document.getElementById("canvas"); var ctx=canvas.getContext("2d"); var BB=canvas.getBoundingClientRect(); var offsetX=BB.left; var offsetY=BB.top; var WIDTH = canvas.width; var HEIGHT = canvas.height; // drag related variables var dragok = false; var startX; var startY; // an array of objects that define different rectangles var rects=[]; rects.push({x:75-15,y:50-15,width:30,height:30,fill:"#444444",isDragging:false}); rects.push({x:75-25,y:50-25,width:30,height:30,fill:"#ff550d",isDragging:false}); rects.push({x:75-35,y:50-35,width:30,height:30,fill:"#800080",isDragging:false}); rects.push({x:75-45,y:50-45,width:30,height:30,fill:"#0c64e8",isDragging:false}); // listen for mouse events canvas.onmousedown = myDown; canvas.onmouseup = myUp; canvas.onmousemove = myMove; // call to draw the scene draw(); // draw a single rect function rect(x,y,w,h) { ctx.beginPath(); ctx.rect(x,y,w,h); ctx.closePath(); ctx.fill(); } // clear the canvas function clear() { ctx.clearRect(0, 0, WIDTH, HEIGHT); } // redraw the scene function draw() { clear(); ctx.fillStyle = "#FAF7F8"; rect(0,0,WIDTH,HEIGHT); // redraw each rect in the rects[] array for(var i=0;i<rects.length;i++){ var r=rects[i]; ctx.fillStyle=r.fill; rect(r.x,r.y,r.width,r.height); } } // handle mousedown events function myDown(e){ // tell the browser we''re handling this mouse event e.preventDefault(); e.stopPropagation(); // get the current mouse position var mx=parseInt(e.clientX-offsetX); var my=parseInt(e.clientY-offsetY); // test each rect to see if mouse is inside dragok=false; for(var i=0;i<rects.length;i++){ var r=rects[i]; if(mx>r.x && mx<r.x+r.width && my>r.y && my<r.y+r.height){ // if yes, set that rects isDragging=true dragok=true; r.isDragging=true; } } // save the current mouse position startX=mx; startY=my; } // handle mouseup events function myUp(e){ // tell the browser we''re handling this mouse event e.preventDefault(); e.stopPropagation(); // clear all the dragging flags dragok = false; for(var i=0;i<rects.length;i++){ rects[i].isDragging=false; } } // handle mouse moves function myMove(e){ // if we''re dragging anything... if (dragok){ // tell the browser we''re handling this mouse event e.preventDefault(); e.stopPropagation(); // get the current mouse position var mx=parseInt(e.clientX-offsetX); var my=parseInt(e.clientY-offsetY); // calculate the distance the mouse has moved // since the last mousemove var dx=mx-startX; var dy=my-startY; // move each rect that isDragging // by the distance the mouse has moved // since the last mousemove for(var i=0;i<rects.length;i++){ var r=rects[i]; if(r.isDragging){ r.x+=dx; r.y+=dy; } } // redraw the scene with the new rect positions draw(); // reset the starting mouse position for the next mousemove startX=mx; startY=my; } } }; // end $(function(){}); </script> </head> <body> <canvas id="canvas" width=300 height=300></canvas> </body> </html>

Estoy tratando de implementar una aplicación en la que el usuario pueda arrastrar y soltar varios objetos dentro de un área determinada ... Estoy usando la etiqueta html5 canvas para implementar esto ... Cuando solo hay un objeto para arrastrar y soltar dentro del lienzo, entonces el código funciona bien, pero cuando intento arrastrar varios objetos de forma independiente dentro del lienzo, no obtengo el resultado deseado.

Aquí está el ejemplo de trabajo de arrastrar y soltar de un solo objeto con la función de dibujar

http://jsfiddle.net/KZ99q/

function draw() { clear(); ctx.fillStyle = "#FAF7F8"; rect(0,0,WIDTH,HEIGHT); ctx.fillStyle = "#444444"; rect(x - 15, y - 15, 30, 30);

}

Pensé que agregar más objetos en la función draw () haría, así que agregué código para nuevos objetos en la función draw () como se muestra en este enlace

http://jsfiddle.net/KZ99q/1/

function draw() { clear(); ctx.fillStyle = "#FAF7F8"; rect(0,0,WIDTH,HEIGHT); ctx.fillStyle = "#444444"; rect(x - 15, y - 15, 30, 30); ctx.fillStyle = "#ff550d"; rect(x - 25, y - 25, 30, 30); ctx.fillStyle = "#800080"; rect(x - 35, y - 35, 30, 30); ctx.fillStyle = "#0c64e8"; rect(x - 45, y - 45, 30, 30); }

Parece que no puedo entender qué cambios necesito hacer en las funciones MyMove (), MyUp () y MyDown () para hacer que los objetos se muevan independientemente el uno del otro. Ayuda