1

我可以使用 jquery 在 KineticJS 中实现对图像的对齐网格操作吗?(http://jqueryui.com/demos/draggable/snap-to.html)就像我在画布内几乎没有可拖动的图像,我希望它们限制画布内的移动......

当画布中的一张靠近另一张时,两张图片是否可以合在一起?是否可以使用 kinetic.js 或 javascript 来实现...

谢谢阿什什

这是代码..它有点复杂。我的意思是我正在从画布外部加载图像..并且有两组..现在我希望一组能够捕捉到另一组..

  <script src="kinetic-v3.8.0.min.js">
  </script>
  <link rel="stylesheet" href="../../themes/base/jquery.ui.all.css">
<script src="jquery-1.7.1.js"></script>
<script src="jquery.ui.core.js"></script>
<script src="jquery.ui.widget.js"></script>
<script src="jquery.ui.mouse.js"></script>
<script src="jquery.ui.draggable.js"></script>



    <script>
        function drawImage(imageObj){

            var stage = new Kinetic.Stage("container", 578, 500);
            var layer = new Kinetic.Layer();
            var x = stage.width / 2 - 200 / 2;
            var y = stage.height / 2 - 137 / 2;
            var width = 200;
            var height = 137;

            // darth vader
            var darthVaderImg = new Kinetic.Shape(function(){
                var context = this.getContext();

                context.clearRect(x,y,width,height);
                context.drawImage(imageObj, x, y, width, height);
                // draw invisible detectable path for image
                context.beginPath();
                context.rect(x, y, width, height);
                context.closePath(); 


          });

            // enable drag and drop
            darthVaderImg.draggable(true);

            // add cursor styling
            darthVaderImg.on("mouseover", function(){
                document.body.style.cursor = "pointer";
            });
            darthVaderImg.on("mouseout", function(){
                document.body.style.cursor = "default";
            });
            //remove image on double click
            darthVaderImg.on("dblclick dbltap", function(){
            layer.remove(darthVaderImg);


            layer.draw();
                });
            layer.add(darthVaderImg);
            stage.add(layer);

            //events

        }


         function drawImage2(imageObj){

            var stage = new Kinetic.Stage("container", 578, 500);
            var layer = new Kinetic.Layer();

            var x = stage.width / 2 - 300 ;
            var y = stage.height / 2 - 137 ;
            var width = 200;
            var height = 137;

            // darth vader

            var darthVaderImg2 = new Kinetic.Shape(function(){
                var context = this.getContext();

                context.drawImage(imageObj, x, y, width, height);

                // draw invisible detectable path for image
                context.beginPath();
                context.rect(x, y, width, height);
                context.closePath();

            });

            // enable drag and drop
            darthVaderImg2.draggable(true);

            // add cursor styling
            darthVaderImg2.on("mouseover", function(){
                document.body.style.cursor = "pointer";
            });
            darthVaderImg2.on("mouseout", function(){
                document.body.style.cursor = "default";
            });
            //remove image on double click
            darthVaderImg2.on("dblclick dbltap", function(){
            layer.remove(darthVaderImg2);


            layer.draw();



                   });
                layer.add(darthVaderImg2);

             stage.add(layer);



          $( ".darthVaderImg2" ).draggable({ grid: [ 20,20 ] });

             }



               function load(img){
                 // load image

                 var imageObj = new Image();
                 imageObj.onload = function(){

                drawImage(this);

                  };
                   imageObj.src = img.src;
                    };
                 function load2(img){
             // load image
                 var imageObj = new Image();
                imageObj.onload = function(){
                drawImage2(this);
               };
               imageObj.src = img.src;
                 };
             </script>
            <title>HTMl5 drag drop multiple elements</title></head>
             <body onmousedown="return false;">
              <div id="container">
              </div>
             <div id="check1">
            <ul id="img"> <li><a href="#"onclick="load(document.getElementById('i1'))">
            <img class="ui-widget-header" src="dog.png" id="i1" alt="doggie"     width="60"height="55"/>
      </a></li>
      <li>
        <a href="#" onclick="load(document.getElementById('i2'))">
        <img src="dog2.png" id="i2" alt="Pulpit rock" width="60" height="55"        /></a>
    </li>
    </ul>
    </div>
    <ul id="img1">
        <li><a href="#" onclick="load2(document.getElementById('i4'))">
            <img alt="doggie" src="beach.png" id="i4" width="60" height="55" />
             </a></li>
             <li><a href="#" onclick="load2(document.getElementById('i5'))">
        <img alt="doggie" src="cat3.png" id="i5" width="60" height="55" /></a></li>
       </ul>
       </body>
        </html>
4

3 回答 3

2

您可以通过使用 dragBoundFunc 来做到这一点。

      return {
        x: Math.round(pos.x / grid) * grid,
        y: Math.round(pos.y / grid) * grid
      }

我创建了一个完整的捕捉示例:http: //jsfiddle.net/PTzsB/1/

于 2013-10-11T10:14:52.373 回答
1

这都是很有可能的。不过,它需要比普通的 jQuery 用户更熟悉一些。

首先,实现 snap-to:

这是一个简单的想法。您使用 jQuery UI 库。您可以通过在所有具有“KineticJsImage”类的元素上调用“snap-to”来为“snap-to”功能添加必要的功能。

$( ".KineticJsImage" ).draggable({ snap: true });

其次,对于 KineticJs 传播的所有图像,我们添加类“KineticJsImage”

..I don't have anything to work with here...
You simply need to find where the image output is controlled and add a class
of KineticJsImage to the code.

正如您在第一个问题中提到的,您已经找到了 snap-to 操作。该页面演示中的第二个框使用通用(我上面提到的代码) snap: true 参数。当您调用它时,您是在告诉页面将所有具有“KineticJsImage”类的可拖动元素捕捉到任何也被声明为拖动的元素。

 $(".someElement").draggable({ snap: false }); // drags wherever, does not snap.
 $(".KineticJsImage").draggable({snap: true }); // drags everywhere, snaps to anything.
 $(".KineticJsImage").draggable({snap: '.KineticJsImage' }); // This will ensure that
 any element with the class of 'KineticJsImage' is not only draggable, but will snap
 to any other element with the class of' 'KineticJsImage' that is also draggable.

您想要实现的一切都可以使用 jQuery UI 和其中提供的可拖动/可放置扩展来实现。

鬼鬼祟祟,试着弄清楚。如果不能,请返回代码,我们会告诉您从那里去哪里。$("

于 2012-02-28T08:54:45.270 回答
1

我提交了一个不使用 jQuery 的问题的答案。相反,您可以应用一个补丁,它可以让您在 HTML5 画布上的 KineticJS 中使用对齐网格进行拖放。

使用带有 kineticJs 的 jquery 可拖动 UI 使元素对齐网格?

于 2012-05-09T21:58:42.293 回答