首先,爲了簡單起見,這裏是如何與你的鼠標和KineticJS繪製基本路線小提琴:http://jsfiddle.net/projeqht/fF3hh/
比方說,你已經在舞臺上的兩個圓,和你需要畫一條線連接它們。
我們可以使用e.targetNode
選擇對每個事件(鼠標按下,鼠標鬆開)的節點,例如:
layer.on("mousedown", function (e) {
var nodeDown = e.targetNode;
}
layer.on("mouseup", function (e) {
var nodeUp = e.targetNode;
}
我們需要檢查的nodeDown
父是Kinetic.Group 或別的東西。
- 如果目標節點
nodeDown
有Kinetic.Group的父母,我們可以用這個組來存儲新行,第二目標節點nodeUp
。
- 如果目標節點
nodeUp
沒有家長的Kinetic.Group,我們需要查看nodeUp
是否有家長組。如果nodeUp
有一個父母的Kinetic.Group,那麼我們可以使用該組來存儲新行,並且第一個目標節點爲nodeDown
。
- 如果
nodeDown
或nodeUp
都沒有父母組,那麼我們需要爲他們創建一個新組,並將所有3個形狀(2個圓圈和一行)添加到該新組中。
使用本教程學習如何從1組移動形狀到另一個:http://www.html5canvastutorials.com/kineticjs/html5-canvas-move-shape-to-another-container-with-kineticjs/
另外,如果你從一個組移動到另一個形狀,你可能要remove()
或destroy()
額外的組,如果它不再需要。
繪製線條時,必須禁用拖動形狀,以便用鼠標拖動和繪製。你可以通過做一些與此類似:
function stopDrag() {
for (var i=0; i<layer.children.length; i++) {
layer.children[i].setDraggable(false);
}
}
function startDrag() {
for (var i=0; i<layer.children.length; i++) {
layer.children[i].setDraggable(true);
}
}
這將使層拖動和undraggable的所有孩子,但你可能想通過比選layer.children
更具體的限制。我喜歡在這裏使用的一個很好的技巧是將所有可拖動的組命名爲「draggable_shapes」,然後使用var draggableArray = stage.get('.draggable_shapes')
選擇允許拖動的所有組,然後您可以循環訪問該數組並且setDraggable()
。
另一點需要注意的是,Line的X和Y座標計算起來有點棘手,這取決於它是否具有Group作爲父層或Layer。如果線是分組的,線的座標將相對於組的位置,否則線的座標將相對於階段(左上角)。
這會讓你開始連接兩條不同的圓圈。如果你想讓線條只連接在圓圈的外緣上,那麼你需要做座標邏輯。
也許你可能想在每個圓圈後面添加一個透明的矩形(屬性opacity: 0
),以便在帶有矩形的mousedown上,您將調用drawLine()
開始繪製一條線。否則,如果用戶點擊該圈子,則會拖動該組。至少它與lucid圖表應用程序具有相似的功能。
自定義命中功能(http://www.html5canvastutorials.com/kineticjs/html5-canvas-kineticjs-custom-hit-function-tutorial/)可能是一個更乾淨的方式來做到這一點,但我不是100%使用自定義命中功能,別人可能會更好。
讓我知道你是否需要進一步的幫助。祝你好運!
非常感謝你的回答。我明天會試試看,因爲我現在腦子裏有一個很大的結。我已經將答案標記爲已接受,因爲乍看之下,這一切似乎都非常詳細和合乎邏輯,再次感謝你! :) – Dominik
+1爲自定義命中功能。這對他們來說是一個完美的用例 –
所以,它的工作:)只是爲了信息。唯一的問題:使用觸摸界面,我只能得到Na和X座標。任何關於如何更改代碼來實現觸摸座標的想法?我嘗試了getTouchPosition(),並再次getX等,但它沒有奏效。 – Dominik