一直在努力让这项工作顺利进行。这是我的代码:
<canvas id="graphCanvas" ondrop="drop(event)" ondragover="allowDrop(event)" height=600 width=1000 style="border:1px solid #000000;"></canvas>
<img id="img1" src="./images/arrow_up.svg" draggable="true" onmousedown="get_pos(event)" ondragstart="drag(event)"/>
<script type="text/javascript">
function init() {
var canvas = document.getElementById("graphCanvas");
var context = canvas.getContext("2d");
context.lineWidth = 2;
}
var pos;
function allowDrop(ev) {
ev.preventDefault();
}
function get_pos(ev){
pos = [ev.pageX, ev.pageY];
}
function drag(ev) {
ev.dataTransfer.setData("Text",ev.target.id);
}
function drop(ev) {
ev.preventDefault();
var offset = ev.dataTransfer.getData("text/plain").split(',');
var data=ev.dataTransfer.getData("Text");
var img = canvas = document.getElementById("img1");
var dx = pos[0] - img.offsetLeft;
var dy = pos[1] - img.offsetTop;
document.getElementById("graphCanvas").getContext("2d").drawImage(document.getElementById(data), ev.pageX - dx, ev.pageY - dy);
}
</script>
我认为这是一个可以拖放到画布中的可拖动图像。一旦图像在画布中,用户就可以移动该图像。不幸的是,我似乎无法让它发挥作用。如果您将图像放在左上角附近,则图像应该出现,但图像显示在右下角附近。
如何解决此问题?
答案 0 :(得分:5)
您可以使用html5 draggable在画布上放置图像元素。
然后你可以在画布上绘制图像的副本。
您需要此信息在画布上绘制可拖动图像的副本:
相对于可拖动图像的鼠标位置(参见下面的mousedown)
相对于文档的画布位置(canvasElement.offsetLeft&amp; canvasElement.offsetTop)。
相对于drop处文档的鼠标位置(dropEvent.clientX&amp; dropEvent.clientY)
可拖动元素的ID(在dragEvent.dataTransfer中存储和检索)
使用此信息,您可以像这样drawImage一个可拖动元素的副本:
function drop(ev) {
ev.preventDefault();
var dropX=ev.clientX-canvasLeft-startOffsetX;
var dropY=ev.clientY-canvasTop-startOffsetY;
var id=ev.dataTransfer.getData("Text");
var dropElement=document.getElementById(id);
// draw the drag image at the drop coordinates
ctx.drawImage(dropElement,dropX,dropY);
}
以下是示例代码和演示:http://jsfiddle.net/m1erickson/WyEPh/
<!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; padding:20px; }
#graphCanvas{border:1px solid #000000;}
</style>
<script>
$(function(){
var canvas=document.getElementById("graphCanvas");
var ctx=canvas.getContext("2d");
var canvasLeft=canvas.offsetLeft;
var canvasTop=canvas.offsetTop;
canvas.ondrop=drop;
canvas.ondragover=allowDrop;
//
var img=document.getElementById("img1");
img.onmousedown=mousedown;
img.ondragstart=dragstart;
// this is the mouse position within the drag element
var startOffsetX,startOffsetY;
function allowDrop(ev) {
ev.preventDefault();
}
function mousedown(ev){
startOffsetX=ev.offsetX;
startOffsetY=ev.offsetY;
}
function dragstart(ev) {
ev.dataTransfer.setData("Text",ev.target.id);
}
function drop(ev) {
ev.preventDefault();
var dropX=ev.clientX-canvasLeft-startOffsetX;
var dropY=ev.clientY-canvasTop-startOffsetY;
var id=ev.dataTransfer.getData("Text");
var dropElement=document.getElementById(id);
// draw the drag image at the drop coordinates
ctx.drawImage(dropElement,dropX,dropY);
}
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="graphCanvas" height=300 width=300></canvas>
<img id="img1" src="house32x32.png" draggable="true" />
</body>
</html>
然而......在画布上绘制的图像只是画了像素,因此不能拖动
您可以使用像KineticJS这样的画布库来创建“保留”图像,这些图像可以在画布上绘制后拖动。
这是一个使用KineticJS进行的演示,允许以后在画布上拖动掉落的图像: