質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3256閲覧

Konva.js で stage のドラッグ&ドロップ機能を追加したい

退会済みユーザー

退会済みユーザー

総合スコア0

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/02/26 08:01

現在このような、stageをズームインとズームアウトが出来るコードがあります。
https://jsfiddle.net/takeshi1234/us20aLhn/16/

実現したい内容は、ズームインした後にstage内でドラッグ&ドロップとした際に、ドラッグ&ドロップした分だけstage内の画像を動かしたいです。

また、画像より外側の領域にはいかないようにストップさせたいです。
(無限に動かせる訳ではなく、stage内に画像はとどめたい)

伝わりにくいかと思いますが、捕捉などもいたしますので、ご教授願います。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

↓ここが参考になります。
HTML5 Canvas Simple Drag Bounds Tutorial | Konva - JavaScript 2d canvas library

js

1 var stage = new Konva.Stage({ 2 container: 'container', 3 width: width, 4 height: height, 5 draggable: true, 6 dragBoundFunc: function(pos) { 7 var scale = stage.scaleX(); 8 return { 9 x: Math.max( Math.min( pos.x, 0 ), width * ( 1 - scale ) ), 10 y: Math.max( Math.min( pos.y, 0 ), height * ( 1 - scale ) ), 11 }; 12 }, 13 });

サンプル

投稿2020/02/26 08:45

編集2020/02/26 08:52
Lhankor_Mhy

総合スコア36140

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/26 14:27

ありがとうございます! また質問で申し訳ないのですが、stageの大きさを固定ではなく可変にしたいです。(レスポンシブ) こちらを参考にしたのですが、うまく実装することができず、、、 https://konvajs.org/docs/sandbox/Responsive_Canvas.html イメージだとstageがcontainerの大きさによって大きくなったり小さくなったりしますが、そこに乗っているレイヤーは相対的に大きくなったり小さくなったりするイメージです。 自分で実装した際はstageの大きさは変わりますが、ドラッグ&ドロップをした時にとんでもないところに一瞬飛んで固まってしまいました。 ズームインとズームアウトのほうは、 fitStageIntoParentContainer() の中の containerWidth / stage.getWidth() でとっているscaleをフィールドで保持して、 教えて頂いたズームのところの実装を newScale = Math.max(newScale, 保持したScale); newPos.x = Math.max(newPos.x, width * (保持したScale - newScale)); newPos.y = Math.max(newPos.y, height * (保持したScale - newScale)); に変えたところ正常に動きました。 ただ、ドラッグアンドドロップのほうはどうしても自力で解決できず、、、 よろしくお願いします。
Lhankor_Mhy

2020/02/27 01:20

このサンプル、スマホとかの縦長画面になると、下にstage外の領域ができてしまいますので、そのままでは使えないですね……
退会済みユーザー

退会済みユーザー

2020/02/27 01:57

なるほど、、、 やりたい事の本質としてはレスポンシブというより fitStageIntoParentContainer()の処理を利用して、(5000 * 5000) や (3000 * 3000) などの大きさの異なる正方形の画像を、同じ大きさで表示させたくて。 var containerWidth = 800;//表示させたいstageの大きさ var scale = containerWidth / imageSize;//画像の一辺の長さ stage.width(stageWidth * scale); stage.height(stageHeight * scale); stage.scale({ x: scale, y: scale }); stage.draw(); ってやるとどの画像を入れても同じ大きさになってくれるので、実装してみたのですが、、、 ズームのほうはうまく動かせたのですが、、、
退会済みユーザー

退会済みユーザー

2020/02/27 01:59

このやり方以外にも方法はないでしょうか、、 ズームとドラッグアンドドロップを機能させたまま、、、
Lhankor_Mhy

2020/02/27 03:40

えええ、そんな今更。 もう、レスポンシブのコード書いてしまいましたが…… 質問の目的というか、希望する動作はきちんとFIXしておいてほしいのですが。
Lhankor_Mhy

2020/02/27 03:43

あとはもう自分でやってほしい……
退会済みユーザー

退会済みユーザー

2020/02/27 04:56

ありがとうございます、、、帰宅したら実装してみます、、、ほんと助かります、、、
退会済みユーザー

退会済みユーザー

2020/02/27 11:11

ダメでした、色々試してみたのですが自力で解決出来なそうです。
退会済みユーザー

退会済みユーザー

2020/02/28 00:24 編集

解決しましたありがとうございました
Lhankor_Mhy

2020/02/28 00:52

ご解決されて何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問