0
私はcreatejsキャンバスを使って、クリック時にステージの空き領域に新しい状態(円)を追加しようとしていますが、クリック時に既存の点をドラッグします。私は問題がそれは専用の静的なハンドラを持っていないので、それが適切に削除されないhandleMoveでstagemousemoveイベントを削除しようとしていると仮定しているが、私はそのハンドラを作成する方法もわからない。あなたがoff()
メソッドを使用する場合形状を作成する/ドラッグアンドドロップする
// create new state (circle)
function createState(e) {
x = e.stageX
y = e.stageY
if (stage.children.every(el =>
!(el.hitTest(x, y)) &&
!(el.hitTest(x + 30, y + 30)) &&
!(el.hitTest(x + 30, y - 30)) &&
!(el.hitTest(x - 30, y + 30)) &&
!(el.hitTest(x - 30, y - 30))
)) {
state = new createjs.Shape()
state.graphics.ss(3)
.s('#777')
.f('#eaeaea')
.dc(x, y, 30)
stage.addChild(state)
state.on('mousedown', handleMove)
stage.update()
}
}
// drag and drop
function handleMove(e) {
el = stage.getObjectUnderPoint(stage.mouseX, stage.mouseY);
var offset = {
x: el.x - e.stageX,
y: el.y - e.stageY
}
stage.on('stagemousemove', (evt) => {
el.x = offset.x + evt.stageX
el.y = offset.y + evt.stageY
stage.update()
})
stage.on('stagemouseup', (e) => {
stage.off('stagemousemove', (evt) => {
el.x = offset.x + evt.stageX
el.y = offset.y + evt.stageY
stage.update()
})
})
}
// determines whether to create new point
function handler(e) {
if (stage.getObjectUnderPoint(stage.mouseX, stage.mouseY) == null)
createState(e)
}
stage.on('stagemousedown', handler)
ありがとうLanny、これは完璧に動作します。あなたが 'on()'呼び出しからのリターンとして参照を得ることができないのは私には分かりませんでした。しかし、ハンドラには1つの問題があります。既存の状態(円)をクリックしてすぐにドラッグすると、実際に円をドラッグするのではなく、ドラッグした方向に新しい状態が作成されます。 –
あなたの 'handler()'が毎回起動しているようです。クリックしても、いつも「stagemousedown」が起動することに注意してください。もう1つのこと - あなたは "pressmove"イベントハンドラを調べましたか?ドラッグ&ドロップ操作のためのリスナーの多くの管理をしています。 – Lanny
私は '' pressmove''を見ましたが、2つのハンドラを持たずにドラッグのオフセットを計算するのに問題があります。私は 'stagemousownown'が毎回発生することを理解していますが、私の' if'ステートメントは、クリックターゲットが状態の場合に新しい状態が作成されることを許してはいけませんか?クリックしてドラッグするといくらか遅延があるようです。 [こちらのデモを見る](http://www.greg-wolff.com/fasdemo)状態をすばやくクリックしてドラッグすると、新しい状態が作成されます。マウスターゲットをコンソールに記録する。 –