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どうぞよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/08 20:26