1

jquery を使用して、KineticJS の画像を使用してスナップ トゥ グリッド操作を実装できますか? (http://jqueryui.com/demos/draggable/snap-to.html)キャンバス内にドラッグ可能な画像がほとんどなく、キャンバス内の動きを制限したい...

キャンバス内で一方の画像が他方の画像に近づくと、2 つの画像が一緒にスナップできる可能性さえありますか?? そして、kinetic.jsまたはjavascriptを使用して実現できますか...

ありがとうアシッシュ

これがコードです..少し複雑です。つまり、キャンバスの外から画像をロードしています..そして2つのセットがあります..今、1つのセットを他のセットにスナップできるようにしたい..

  <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を使用しないこの質問への回答を送信しました。代わりに、HTML5 キャンバス上の KineticJS でグリッドにスナップしてドラッグ アンド ドロップできる、適用可能なパッチがあります。

kineticJsでjqueryのドラッグ可能なUIを使用して、要素をグリッドにスナップさせますか?

于 2012-05-09T21:58:42.293 に答える
1

これはすべて非常に可能です。ただし、平均的な jQuery ユーザーよりも少し慣れている必要があります。

まず、スナップ先を実装します。

これは単純な考えです。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.

最初の質問で述べたように、スナップ操作が見つかりました。そのページのデモの 2 番目のボックスでは、ジェネリック (前述のコード) snap: true パラメーターを使用しています。これを呼び出すと、「KineticJsImage」のクラスを持つすべてのドラッグ可能な要素を、draggle と宣言されている任意の要素にスナップするようにページに指示します。

 $(".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 に答える