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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1162閲覧

dragしているviewを避けていく機能

i_zac8132

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/05/08 01:56

Javaに関する質問です。
現在Android Studioを用いて簡単なアプリ制作に取り組んでいます。

その中で、
「drag操作中にそのviewが存在する領域を判定し、それによって元からあるviewの位置を逐一
変えていく」
といった機能を実装させたいのですが、うまく動作させることができません。

イメージは、
「自分の動かしているviewをもとからあるviewたちが避けていく」
といったようなものです。

テスト試験用に作った
「buttonAとbuttonBの間にviewを持っていくと二つがそれを避ける」
という目論見のもと作成したプログラムのコードを載せさせていただきます。

以下DragViewListener Classコード

Java

1--- 2public class DragViewListener implements View.OnTouchListener { 3 4 //宣言などは省略 5 6public boolean onTouch(View view, MotionEvent event){ 7 8//dragViewが二つのbuttonの間にいることを判定するためのRectを作りました 9 Rect insertRect = new Rect(); 10 buttonA.getHitRect(insertRect); 11 int[] offsetForInsert = new int[2]; 12 buttonA.getLocationOnScreen(offsetForInsert); 13 insertRect.offset(offsetForInsert[0], offsetForInsert[1] + moduleB[i].getHeight()/2); 14 15 //dragの処理をするためのものです 16 int x = (int) event.getRawX(); 17 int y = (int) event.getRawY(); 18 19 switch (event.getAction()) { 20 case MotionEvent.ACTION_MOVE: 21 int left = dragView.getLeft() + (x - oldx); 22 int top = dragView.getTop() + (y - oldy); 23 dragView.layout(left, top, left + dragView.getWidth(), top + dragView.getHeight()); 24 25 //この部分が位置をずらす処理になります。 26 if(insertRect.contains(x, y)){ //もし差し込みされていた場合 27 buttonA.layout(元の位置から上にずれたところ); 28 buttonB.layout(元の位置から下にずれたところ); 29 Log.d("check", "patternA"); //二つの位置が上下にずれます 30 }else{ //そうでない場合 31 buttonA.layout(元の位置); 32 buttonB.layout(元の位置); 33 Log.d("check", "patternB"); //二つは元の位置に戻ります 34 } 35 break; 36 case MotionEvent.ACTION_UP: 37 //その他のアクション時は省略 38 break; 39 } 40 oldx = x; 41 oldy = y; 42 return true; 43 } 44 45--- 46ここまでコード 47 48 49 以上のようなプログラムを組むと、 50 元からいたbutttonAとbuttonBがすごい勢いで"元の位置""ズレの位置"の二点を往復してしまいます。 51 Logを出力させた結果、patternAとpatternBが交互に反応してしまっていることが原因のようです。 52 53 viewは動かしていないのでifの分岐がpatternBに入る理由がわかりません。 54 どなたかなぜこのようになってしまうのかわかる方はいらっしゃいませんか? 55 56 皆様のご教授お待ちしております。 57 大変面倒だとは思いますがどうぞよろしくお願いいたします。 58 59失礼いたしします。 60 61また大変失礼かとは思いますが、某有名掲示板にも同じ質問書き込みを先に投稿させていただいております。 62こちらのサイトの方が優秀な方々が多いと聞きましてやってきました。今回が初投稿になります。 63気分を悪くされる方がいらっしゃいましたら大変申し訳ありません。 64 65どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ロジックがおかしいと思います。
1回目と2回目の処理は下記のようになりますよね。
・1回目の処理
1-ButtonAからButtonAの描画領域矩形を取得。この時、得られるのは避ける前の矩形。
2-タッチ位置が1で得られた矩形の中かを判定する。この時、矩形の中にあるのでButtonAの描画領域矩形は避ける位置に修正される。
・2回目の処理
3-ButtonAからButtonAの描画領域矩形を取得。この時、得られるのは避けた後の矩形。
4-タッチ位置が2で得られた矩形の中かを判定する。この時、矩形の外にあるのでButtonAの描画領域矩形は元の位置に修正される。

上記の1-4を繰り返すと元の位置と避ける位置を交互に移動することになります。

修正するにはタッチ位置と比較する描画領域矩形は常に元の位置の物にする必要がありますね。

投稿2016/05/08 03:08

yona

総合スコア18155

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

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

i_zac8132

2016/05/08 20:26

回答ありがとうございます! 本当ですね。。。 おっしゃられる通りRectの位置がonTouchの呼び出しごとに行われていたようです。 listenerのconstructorにrectの定義を入れることで無事解決いたしました。 大変助かりました!ありがとうございました!! 精進させていただきます。また何かありましたらよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問