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

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

ただいまの
回答率

90.48%

  • Java

    14145questions

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

  • Android Studio

    3800questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 364

i_zac8132

score 10

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

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

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

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

 以下DragViewListener Classコード

```Java

public class DragViewListener implements View.OnTouchListener {

 //宣言などは省略

public boolean onTouch(View view, MotionEvent event){

//dragViewが二つのbuttonの間にいることを判定するためのRectを作りました
    Rect insertRect = new Rect();
    buttonA.getHitRect(insertRect);
    int[] offsetForInsert = new int[2];
    buttonA.getLocationOnScreen(offsetForInsert);
    insertRect.offset(offsetForInsert[0], offsetForInsert[1] + moduleB[i].getHeight()/2);

    //dragの処理をするためのものです
    int x = (int) event.getRawX();
    int y = (int) event.getRawY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            int left = dragView.getLeft() + (x - oldx);
            int top = dragView.getTop() + (y - oldy);
            dragView.layout(left, top, left + dragView.getWidth(), top + dragView.getHeight());

            //この部分が位置をずらす処理になります。
            if(insertRect.contains(x, y)){ //もし差し込みされていた場合
                buttonA.layout(元の位置から上にずれたところ);
                buttonB.layout(元の位置から下にずれたところ);
                Log.d("check", "patternA"); //二つの位置が上下にずれます
            }else{ //そうでない場合
                buttonA.layout(元の位置);
                buttonB.layout(元の位置);
                Log.d("check", "patternB"); //二つは元の位置に戻ります
            }
            break;
        case MotionEvent.ACTION_UP:
            //その他のアクション時は省略
            break;
    }
    oldx = x;
    oldy = y;
    return true;
 }


ここまでコード

 以上のようなプログラムを組むと、
 元からいたbutttonAとbuttonBがすごい勢いで"元の位置"と"ズレの位置"の二点を往復してしまいます。
 Logを出力させた結果、patternAとpatternBが交互に反応してしまっていることが原因のようです。

 viewは動かしていないのでifの分岐がpatternBに入る理由がわかりません。
 どなたかなぜこのようになってしまうのかわかる方はいらっしゃいませんか?

 皆様のご教授お待ちしております。
 大変面倒だとは思いますがどうぞよろしくお願いいたします。

失礼いたしします。 

また大変失礼かとは思いますが、某有名掲示板にも同じ質問書き込みを先に投稿させていただいております。
こちらのサイトの方が優秀な方々が多いと聞きましてやってきました。今回が初投稿になります。
気分を悪くされる方がいらっしゃいましたら大変申し訳ありません。

どうぞよろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/09 05:26

    回答ありがとうございます!

    本当ですね。。。
    おっしゃられる通りRectの位置がonTouchの呼び出しごとに行われていたようです。
    listenerのconstructorにrectの定義を入れることで無事解決いたしました。

    大変助かりました!ありがとうございました!!
    精進させていただきます。また何かありましたらよろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    JAVAのコンソールログでRPGの作成

    学校の課題でコンソールログで動くRPGを作れといわれました 以下のコードなのですが主人公(●)が動きません どうすれば動ききますか? import java.util.Scanne

  • 解決済

    メソッド内が動作しない

    下記のコードを実行すると、最初にCの画像が出てその1秒か2秒か3秒後にDの画像が出ることを予想していたのですが、実際に試すとCの画像が出たきりです。   public static

  • 解決済

    Androidのタッチについて

    アクションゲームを作っており、 プレーヤーの操作を画面をタッチすることで行おうと思っています。 タッチされた座標を取得する方法ですが、 参考にさせてもらったところ ↑の記事を参考

  • 解決済

    androidstudioについて

    画面タッチをした際に 1点をタッチして2点の処理をすることはできるのでしょうか。 よろしくお願い致します。

  • 解決済

    文字列の解析処理について

    こんにちは。 与えられた文字列を分解する処理を行う下記のソースについて、ご意見を頂ければと思います。 前提・実現したいこと使用言語:Java 与えられる文字列には、「&」また

  • 受付中

    10進数から16進数に変換

    10進数を入力すれば16進数に変換されるというプログラムを作っているのですがいまいちうまくいきませんどこがまちがっているのでしょうか? import java.io.IOExce

  • 解決済

    Fragmentを用いた複数の画面遷移について

    Fragmentを用いて4ページ以上の画面遷移を行いたい場合どういった処理をすればいいでしょうか? 3ページなら以下の処理でできました。 それとFragmentの中に2つのFr

  • 受付中

    Androidアプリでタップした箇所を中心に画像を拡大表示させたいです

    AndroidStudioにてAndroidアプリを制作しております。 Androidアプリでタップした箇所を中心に画像を拡大表示させる機能を実装したいです。 画像の拡

同じタグがついた質問を見る

  • Java

    14145questions

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

  • Android Studio

    3800questions

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