2013-08-01 3 views
3

Я ищу для создания простого коллажа с использованием KineticJS и Canvas. В контейнере холста у меня есть предварительно определенные области изображения. У меня также есть (в DOM и за пределами контейнера для холста), полоса изображений, которую я хочу перетащить к изображениям на холсте. Я могу перетащить изображение и привязать его к (жестко-кодированному) изображению, но пока изображение перемещается по холсту, я не могу получить координаты x и y. Я попытался использовать событие перетаскивания/перетаскивания jQuery, но затем он слеп к холсту, и я попытался использовать функцию Dragover KineticJS, но тогда я не могу получить изображения DOM и x. Идея состоит в том, что, зная, что x, y изображения перетаскиваются, я могу написать некоторую логику, чтобы выяснить, к какому местоположению изображения он должен быть привязан - в отличие от жесткого кодирования.Interspersing KineticJS и события jQuery

Возможно ли это сделать с помощью KineticJS + jQuery - перетащите изображения из DOM на холст и закрепите их в заранее определенных областях изображения? Или, есть ли более простой способ?

+0

Есть ли причина, по которой ваша «полоса изображений» находится за пределами контейнера для холста? Было бы намного проще, если бы вы просто перенесли его в холст - KineticJS может легко справиться с этим сценарием самостоятельно. – projeqht

+0

Только потому, что, когда я нахожусь в нем (для сохранения и вызова для будущего редактирования), мне просто нужны изображения на моем коллаже, а не фотографии на полосе. Имеет ли это смысл? – bachposer

+0

как «жестко закодированные» лунки изображений отличаются от заранее определенных областей изображения? есть ли у вас скрипка, чтобы объяснить это? – Ani

ответ

0

насколько я понимаю вашу проблему, я попытался воспроизвести его, но не видя никаких трудностей

<div width="600" height="500" style="background-color:green;padding-left:60px" id="wrap"> 
    <canvas id="a" width="300" height="225" style="background-color:yellow"></canvas> 
</div> 
<img id="dragMe" src="http://www.linuxmint.com/img/logo.png"/> 
<div id="log"> 
    <span class="a"></span> 
    <span class="b"></span> 
    <span class="c"></span> 
     <span class="d"></span> 
</div> 

$("#wrap").mousemove(function(e){ 
    var pageCoords = "(" + e.pageX + ", " + e.pageY + ")"; 
    var clientCoords = "(" + e.clientX + ", " + e.clientY + ")"; 
    $("#log > span.a").text("(e.pageX, e.pageY) : " + pageCoords); 
    $("#log > span.b").text("(e.clientX, e.clientY) : " + clientCoords); 
}); 
var p = $('#a').position(); 
$("#dragMe").draggable({ 
    drag: function(event, ui) { 
     $("#log > span.c").text( ui.offset.left+':' +ui.offset.top); 
     $("#log > span.d").text((ui.offset.top-p.top)+':' +(ui.offset.left - p.left)); 
    } 
}); 

http://jsfiddle.net/agj3N/1/

+0

@bachposer пытается перетащить изображение на сцену KineticJS, предположительно, работать с изображениями в KineticJS - а не просто на холсте. Ваш пример хорош, но он не решает исходный вопрос .. – projeqht

0

Когда я спросил вас, если у вас есть причина, вы имели полосу изображений вне стадии KineticJS, вы ответили:

только потому, что когда я toJSON его (для сохранения и вызова для будущего редактирования), я просто хочу, чтобы изображения на моем коллаже и не й e фотографии на полосе.

Мой ответ на это:

Вы не должны использовать toJSON на всей стадии.

Если вы разделяете фото Газа (ранее за пределами холста) в другой слой из Коллаж (ранее внутри холста, то вы можете иметь два слоя и использовать toJSON только на одном из этих слоев!

результат будет то, что toJSON только сериализовать объекты из этого данного слоя, который звучит как то, что вам нужно

jsfiddle. - вот пример, чтобы проиллюстрировать, что я имею в виду, простите мою плохую логику для привязки изображения к группе. У меня есть 2 слоя: photoStripLayer и collageLayer

  1. Нажмите на кнопку Коллаж toJSON. Обратите внимание, что вывод console.log не содержит никаких изображений. Это связано с тем, что collageLayer имеет только группу, в которой есть дочерний прямоугольник.

  2. Перетащите первую йоду (вверху слева, остальные не работают, это просто пример) в красный квадрат. Извините, вам придется поиграть с этим, чтобы он правильно привязался (я предполагаю, что у вас уже есть ваш код «привязки»)

  3. dragend Если узел Yoda находится внутри красного ящика, он будет использовать KineticJS 'moveTo Функция перемещения йоды с photoStripLayer ->collageLayer. Вы узнаете, что это сработало, когда Йода привязана к позиции (0,0) относительно новой группы.

  4. Нажмите на кнопку Коллаж toJSON. Обратите внимание, что изображение yoda теперь является частью вывода toJSON console.log. Йода был перенесен в новую группу, которая является дочерней по отношению к collageLayer. Теперь часть коллажа-слоя, Йода -.

Вот dragend код:

   node.on('dragend', function() { 
       var pos = stage.getMousePosition(); 
       var X = pos.x; 
       var Y = pos.y; 
       var minX = snap.getX(); 
       var maxX = snap.getX() + snap.getWidth(); 
       var minY = snap.getY(); 
       var maxY = snap.getY() + snap.getHeight(); 
       if (node.getX() < minX) { 
        node.moveTo(snap); 
        node.setX(0); 
        node.setY(0); 
       } 
       if (node.getX() > maxX) { 
        node.moveTo(snap); 
        node.setX(0); 
        node.setY(0); 
       } 
       if (node.getY() < minY) { 
        node.moveTo(snap); 
        node.setX(0); 
        node.setY(0); 
       } 
       if (node.getY() > maxY) { 
        node.moveTo(snap); 
        node.setX(0); 
        node.setY(0); 
       } 
       photoStripLayer.draw(); 
       collageLayer.draw(); 
      }); 

И код нажмите кнопку, чтобы проиллюстрировать с помощью toJSON:

  function collageToJSON() { 
       var cjson = collageLayer.toJSON(); 
       console.log(cjson); 
       /* To illustrate, you can also call toDataURL here. But in JSFiddle I think it throws a Security Error. 
       collageLayer.toDataURL({ 
        callback: function(dataUrl) { 
         window.open(dataUrl); 
        } 
       }); 
       */ 
      } 

      document.getElementById('CtoJSON').addEventListener('click', function() { 
       collageToJSON(); 
      }); 

А что у вас есть! Вопрос решается путем предоставления KineticJS обрабатывает весь процесс.

Смежные вопросы