从容器拖动控件并在画布上放置/绘制它们

时间:2014-02-28 11:29:12

标签: javascript jquery html5 canvas

我想允许用户从一个div容器中拖动图标并将其拖放到画布上并保持原始图标不变。图标在表格上动态添加。当我拖动图标时,我也希望用光标拖动图标效果。当我使用“helper:'clone'”属性时,我得到效果但是删除的位置不正确,当我删除此属性时,原始图标被删除。

我的图标的父容器

     <div id="dvEquipmentTool" style="removed: absolute; border: 1px solid rgb(173, 201, 247);
    display: block; background-color: white; height: 400px; z-index: 50000; padding: 3px;
    removed 100px; removed 50px; width: 200px !important;" class="ui-draggable">
    <table id="tbEquipmentTool" border="0" style="background-color: White; padding-left: 10px;
        max-height: 400px !important;">
        <tbody>
            <tr id="tRow1">
                <td>
                    <img src="" id="imgEquipIcon1" class="ui-draggable" style="position: relative; left: 473px;
                        top: 183px;">
                </td>
                <td>
                    <span id="lblImgEquipName1" class="label">10-FL-105-A20</span><span id="lblImgEquipID1"
                        class="label" style="display: none;">100200</span>
                </td>
                <td width="10px">
                </td>
            </tr>
            <tr id="tRow2">
                <td>
                    <img src="" id="imgEquipIcon2" class="ui-draggable" style="position: relative;">
                </td>
                <td>
                    <span id="lblImgEquipName2" class="label">10-FL-3111-A20</span><span id="lblImgEquipID2"
                        class="label" style="display: none;">100199</span>
                </td>
                <td width="10px">
                </td>
            </tr>
        </tbody>
    </table>
</div>

使图像可拖动的Javascript功能

    $("img[id^=imgEquipIcon]").each(function () {


    $(this).draggable({ containment: "#dvContainer", scroll: false,//helper: 'clone',
        stop: function (event, ui) {
            var stoppos = $(this).position();
            alert(stoppos.left+","+ stoppos.top);

            var img = new Image();
            img.src = this.src;
            createEquipIcon(img, stoppos.left, stoppos.top);

        }

    });

});

function createEquipIcon(img, X, Y) {
    var dv = document.createElement('div');

    $(dv).css('top', Y);
    $(dv).css('left', X);
    $(dv).css('cursor', 'move');
    $(dv).css('position', 'absolute');
    $(dv).css('background-color', 'red');

    dv.appendChild(img);
    var index = img.id.replace('imgEquipIcon', '');

    var container = document.getElementById('dvContainer');
    container.appendChild(dv);
   //code for drawing on canvas goes here

}

用于绘制图像的画布

    <div id="dvContainer" runat="server" style="overflow: visible; background-repeat: no-repeat">
            <canvas id="myCanvas" width="1000px" height="600px">
          <b> *Your browser doesn't support canvas. Please switch to different browser.</b>
        </canvas>

1 个答案:

答案 0 :(得分:6)

演示:http://jsfiddle.net/m1erickson/cyur7/

在拖动之前和拖动之后:

enter image description here enter image description here

制作HTML工具栏

  • 创建一个div来保存所有工具图标。
  • 为每个工具创建img元素并将它们放在工具栏div
  • 将所有工具img设为class =“tool”

Html toolbar-div with tool-imgs:

<div id="toolbar">
    <img class="tool" width=32 height=32 src="equipment1.jpg">
    <img class="tool" width=32 height=32 src="equipment1.jpg">
    <img class="tool" width=32 height=32 src="equipment1.jpg">
</div>

使用jQuery

使所有.tools可拖动
  • 选择jquery中的所有.tools($ tools)
  • make all .tools draggable
  • 使用$ tools中的索引为所有.tools提供数据有效负载。

使所有.tools可拖动:

    // select all .tool's

    var $tools=$(".tool");

    // make all .tool's draggable

    $tools.draggable({ helper:'clone' });


    // assign each .tool its index in $tools

    $tools.each(function(index,element){
        $(this).data("toolsIndex",index);
    });

使画布成为放置目标:

    // make the canvas a dropzone
    $canvas.droppable({
        drop:dragDrop,
    });

删除后,在画布上绘制img

  • 获取droppable的落点
  • 获取droppable的数据有效负载($ tools中已删除项目的索引)
  • 使用context.drawImage在画布上绘制已删除的图像

删除处理程序

    // handle a drop into the canvas
    function dragDrop(e,ui){

        // get the drop point (be sure to adjust for border)
        var x=parseInt(ui.offset.left-offsetX)-1;
        var y=parseInt(ui.offset.top-offsetY);

        // get the drop payload (here the payload is the $tools index)
        var theIndex=ui.draggable.data("toolsIndex");

        // drawImage at the drop point using the dropped image 
        ctx.drawImage($tools[theIndex],x,y,32,32);

    }