HTML5 Canvas拖放项目

时间:2014-02-11 21:10:05

标签: html html5 canvas

一直在努力让这项工作顺利进行。这是我的代码:

<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>

我认为这是一个可以拖放到画布中的可拖动图像。一旦图像在画布中,用户就可以移动该图像。不幸的是,我似乎无法让它发挥作用。如果您将图像放在左上角附近,则图像应该出现,但图像显示在右下角附近。

如何解决此问题?

1 个答案:

答案 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进行的演示,允许以后在画布上拖动掉落的图像:

http://jsfiddle.net/m1erickson/LuZbV/