2012-02-29 74 views
1

我是jquery新手 我使用Kinetic.js實現了拖放操作 我在html中有一些圖像,我將它們傳遞給一個javascript函數並使它們可拖動..有兩組圖像。 現在,如果他們靠近,我想讓他們互相打招呼。 我是jquery的新手,所以我不知道如何將動態js圖像變量傳遞給jquery操作,並在其中傳遞了img id標記。 還有我無法弄清楚在何處放置jQuery的功能,以及如何..在kineticJs中使用jQuery可拖動UI來使元素捕捉到網格?

這裏是代碼.. 有人請幫助..

 <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 ON圖像規定操作點擊

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

你不需要kinetic.js來實現這個「快速」的效果,這可以很容易地用jQuery UI來完成! – 2012-02-29 08:34:25

+0

但我需要使用html5畫布..這就是要求..現在必須實現捕捉到網格操作,所以使用jquery..any方法來實現jquery使用kinetic.js ?? – ashishashen 2012-02-29 09:15:43

回答

4

我能夠修改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); 
>      } 
> 

要設置類似於矩形的東西,請確保在實體上設置可拖動爲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}); 
+0

這對我有幫助。僅供參考,在KineticJS 5.1.0中,一個新的函數Node.dragBroundFunc可以在不修改KineticJS本身的情況下提供幫助。 – jd4u 2014-11-04 13:31:30

0

這是有點老了,但是,而不是使一個補丁,你可以做這樣的事情:

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

有可能是這樣做的更好的辦法,但這個工程。

相關問題