Использование перетаскиваемого пользовательского интерфейса jquery с kineticJs для привязки элементов к сетке?

Я новичок в jquery. Я реализовал операцию перетаскивания с помощью Kinetic.js. У меня есть несколько изображений в html, и я передаю их функции javascript и делаю их перетаскиваемыми. Есть два набора изображений. Теперь я хочу чтобы заставить их хвататься друг за друга, если они приближаются. Я новичок в jquery, поэтому я не знаю, как передать переменную изображения кинетического js в операцию jquery, где они передали тег img id. Также я не могу понять, где разместить функцию jquery и как..

Вот код.. Кто-нибудь, пожалуйста, помогите..

        <html>
            <head>
                  <style>

           canvas {
                border: 1px solid #9C9898;
                    }

            #img
                {
                position:absolute;
                left:700px;
                top:150px;
                }
            #img1
                {
                position:absolute;
                left:800px;
                top:150px;
                }
    </style>

Загрузка библиотек jquery

    <script src="kinetic-v3.8.0.min.js"></script>
    <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>

Kinetic.js - чтобы загрузить изображение и сделать его перетаскиваемым

    <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.drawImage(imageObj, x, y, width, height);
                // draw invisible detectable path for image

Нужна помощь с этой функцией jquery, как ее использовать и передать перетаскиваемое изображение кинетического js здесь

                $(function() {
                $(this).draggable({ grid: [ 80, 80 ] });
                });

                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);
          }



        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>

Html, определяющий операцию по щелчку изображения

            <title>HTMl5 drag drop multiple elements</title></head>
            <body onmousedown="return false;">
            <div id="container">
                </div>
             <div id="check1">
            <ul id="img" class="draggable ui-widget-content"    > <li><a href="#" class="draggable ui-widget-content" onclick="load(document.getElementById('i1'))">
            <img src="dog.png" id="i1" class="draggable ui-widget-content" 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>

person boyfromnorth    schedule 29.02.2012    source источник
comment
Вам не нужен кинетический.js для достижения этого мгновенного эффекта, это можно легко сделать с помощью пользовательского интерфейса jQuery!   -  person mas-designs    schedule 29.02.2012
comment
Но мне нужно использовать холст html5. Это требование. Теперь нужно реализовать операцию привязки к сетке, поэтому с помощью Jquery.. любой метод для реализации jquery с использованием kinetic.js ??   -  person boyfromnorth    schedule 29.02.2012


Ответы (2)


Мне удалось изменить kinetic-v3.9.3.js, чтобы разрешить перетаскивание с привязкой со следующим патчем (формат diff):

813a814,825
>      * set drag grid constraint
>      */
>     setDragGridConstraint: function(constraint) {
>         this.attrs.dragGridConstraint = constraint;
>     },
>     /**
>      * get drag grid constraint
>      */
>     getDragGridConstraint: function() {
>         return this.attrs.dragGridConstraint;
>     },
>     /**
1847a1860,1861
>                     var dgc = node.attrs.dragGridConstraint;
>                     
1858a1873,1877
>                     if(dgc !== undefined) {
>                         newNodePos.x = Math.floor(newNodePos.x/dgc.x)*dgc.x + (dgc.x/2);
>                         newNodePos.y = Math.floor(newNodePos.y/dgc.y)*dgc.y + (dgc.y/2);
>                     }
> 

Чтобы настроить это для чего-то вроде прямоугольника, убедитесь, что вы установили для объекта draggable значение true, затем вы можете использовать setDragGridConstraint(), чтобы настроить привязку к расстояниям, как показано ниже.

        var box = new Kinetic.Rect({
            x: rectX,
            y: rectY,
            width: 100,
            height: 50,
            fill: "#00D2FF",
            stroke: "black",
            strokeWidth: 4,
            draggable: true
        });

        box.setDragGridConstraint({x: 50 , y: 50});
person StCredZero    schedule 09.05.2012
comment
Это мне поможет. Просто для информации: в KineticJS 5.1.0 новая функция Node.dragBroundFunc может помочь без изменения самого KineticJS. - person jd4u; 04.11.2014

Это немного устарело, но вместо того, чтобы делать патч, вы можете сделать что-то вроде этого:

var isNearSnapArea = function(image, snapArea) {
          if (image.attrs.x > snapArea.x - 30 && image.attrs.x < snapArea.x + 30 && image.attrs.y > snapArea.y - 30 && image.attrs.y < snapArea.y + 30) {
            return true;
          } else {
            return false;
          }
        }    
var isNearObjectSnapArea = function(image, layer, callback) {
              // What the new object will snap to if it is near it
              var snapTo = { 'x': image.attrs.x, 'y': image.attrs.y };
              for (var x = 0; x < layer.children.length; x++) {
                var myObject = { 'x': layer.children[x].attrs.x, 'y': layer.children[x].attrs.y, '_id': layer.children[x]._id }
                if(isNearSnapArea(image, myObject) && image._id !== myObject._id) {
                  snapTo.x = myObject.x;
                  snapTo.y = myObject.y + 30;
                  callback(snapTo);
                  return;
                }
              }
            }

//Then, later in your program:

image.on('dragend', function() {
                  isNearObjectSnapArea(image, layer, function(snapTo) { 
                    image.attrs.x = snapTo.x;
                    image.attrs.y = snapTo.y;
                    layer.draw();
                  }); 
                });

Вероятно, есть лучший способ сделать это, но это работает.

person mrryanjohnston    schedule 12.06.2012