2012-02-28 16 views
1

jQueryを使用して、KineticJS の画像でグリッドにスナップする操作を実装できますか? (http://jqueryui.com/demos/draggable/snap-to.html) 私はキャンバスの中にドラッグ可能な画像はほとんどないので、キャンバス内で動きを制限したいと思っています。画像、kinetic.js、javascriptを使用してグリッド操作にスナップしますか?

キャンバスにもう一方の画像が近づく?? そして、それはkinetic.jsまたはJavaScriptを使用して達成することができます...

おかげ アシシュここ

は、それは少し複雑だ ...コードです。私は私が1セットは他にスナップできるようにしたい2 sets..now ..

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

答えて

1

これはすべての非常に可能性があるがあるcanvas..and外部から画像をロードしています意味します。しかし、平均的なjQueryユーザーよりも少し慣れている必要があります。

まず、スナップに実装:

する。これは、単純な考えです。 jQuery UIライブラリを使用します。 'snap-to'機能に必要な機能を追加するには、 'KineticJsImage'クラスのすべての要素に対して 'snap-to'を呼び出します。

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

第二には、KineticJsによってpropogated全ての画像について、私たちはクラスの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として宣言されているANY要素にスナップするようページに指示します。

達成したいことは、jQuery UIとdraggable/droppableの拡張機能で実現できます。

わかりやすく解説してください。できないときは、コードを戻ってきて、そこからどこに行くのかを示します。 $(」

+0

ありがとう...私は確かにこれを試してみるつもりです...今ここにあるものです.Jqueryは要素をドラッグ可能にしています。しかし、私の要素は既にドラッグ可能です。だから私はそれと少し混乱しています。これを実装する必要があります..どのように..何かを試してみてください...そしてコードを確実に共有します。その後、私を助けてください。たくさんありがとうございます – ashishashen

+0

私はなぜ古い拡張機能jQuery UIのドラッグ可能なスタンドアロンを使用しますか? – Ohgodwhy

+0

原因私の上司がhtml5キャンバスで物を実装するように言った原因。 – ashishashen

2

あなたはdragBoundFuncを使用して、この別の操作を行うことができ

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

私が作成した完全なスナップ例:http://jsfiddle.net/PTzsB/1/

関連する問題