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

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

ただいまの
回答率

90.53%

  • Java

    15549questions

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

  • Android

    7179questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

マルチタッチで左右の判定がおかしくなる原因が分かりません

解決済

回答 2

投稿 編集

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

ko20vonobird

score 42

前提・実現したいこと

左右に角丸の長方形を描画して、それをタッチした状態の時に色々な処理をしたいです。
とりあえず今の段階ではマルチタッチが指定した領域でできるかのテストのようなものです。
最終的には、左右で一か所ずつタッチ状況を検知して、それをゲームに組み込みたいと思っています。

発生している問題

度々、左をタッチしている状態なのに右を触っていると判定されたり、右をタッチしている状態なのに左を触っていると判定されたりします。
また、両方ともタッチしている状態で片方が角丸長方形の領域をタッチしていてもう片方が画面の外にタッチしたままずれると両方ともタッチしていないという判定になったりします。
さらに、タッチしたまま指をずらしていくと領域を離れているのにタッチしているという判定になったりします。

該当のソースコード

case MotionEvent.ACTION_MOVE:
                colchk = 0;
                fingnum = event.getPointerCount();
                ttx = new float[fingnum];
                tty = new float[fingnum];
                if (fingnum > 1) {
                    for (int cnt = 0; cnt < fingnum; cnt++) {
                        pid = event.getPointerId(cnt);
                        tx = event.getX(cnt);
                        ty = event.getY(cnt);
                        ttx[cnt] = tx;//Data indexを基準とする
                        tty[cnt] = ty;//上に同じ
                        if (colchk == 0) {
                            if (pow(tx - (winW * 0.15f), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || pow(tx - (winW * 0.33f), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || (winW * 0.15f <= tx && tx <= winW * 0.33f) && (winH - (winH * 0.25f) <= ty && ty <= winH - (winH * 0.05f))) {
                                colchk = 1;
                                Log.d("hand", "left");
                            }
                            if (pow(tx - (winW - (winW * 0.33f)), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || pow(tx - (winW - (winW * 0.15f)), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || (winW - (winW * 0.33f) <= tx && tx <= winW - (winW * 0.15f)) && (winH - (winH * 0.25f) <= ty && ty <= winH - (winH * 0.05f))) {
                                colchk = 2;
                                Log.d("hand", "right");
                            }
                        }
                        if (colchk == 1) {
                            if (pow(tx - (winW - (winW * 0.33f)), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || pow(tx - (winW - (winW * 0.15f)), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || (winW - (winW * 0.33f) <= tx && tx <= winW - (winW * 0.15f)) && (winH - (winH * 0.25f) <= ty && ty <= winH - (winH * 0.05f))) {
                                colchk = 3;
                                Log.d("hand", "leftright");
                            }
                        }
                        if (colchk == 2){
                            if (pow(tx - (winW * 0.15f), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || pow(tx - (winW * 0.33f), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winH * 0.1f), 2) || (winW * 0.15f <= tx && tx <= winW * 0.33f) && (winH - (winH * 0.25f) <= ty && ty <= winH - (winH * 0.05f))) {
                                colchk = 3;
                                Log.d("hand", "leftright");
                            }
                        }
                        if (colchk == 0) {
                            Log.d("hand", "none");
                        }
                    }
                } else if (fingnum == 1) {
                    if (pow(tx - (winW * 0.15f), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winW * 0.1f), 2) || pow(tx - (winW * 0.33f), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winW * 0.1f), 2) || (winW * 0.15f <= tx && tx <= winW * 0.33f) && (winH - (winH * 0.25f) <= ty && ty <= winH - (winH * 0.05f))) {
                        colchk = 1;
                        Log.d("hand", "left");
                    } else if (pow(tx - (winW - (winW * 0.33f)), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winW * 0.1f), 2) || pow(tx - (winW - (winW * 0.15f)), 2) + pow(ty - (winH - (winH * 0.15f)), 2) < pow((winW * 0.1f), 2) || (winW - (winW * 0.33f) <= tx && tx <= winW - (winW * 0.15f)) && (winH - (winH * 0.25f) <= ty && ty <= winH - (winH * 0.05f))) {
                        colchk = 2;
                        Log.d("hand", "right");
                    } else {
                        Log.d("hand", "none");
                    }
                }
                break;

確認したこと

ログ出力で、どちらの判定になっているか確かめました。

補足

winHは画面の高さ、winWは画面の幅です。
colchkを用いてその都度のタッチ状態を記録しています。colchk=1で左の角丸四角形をタッチされたことを表し、colchk=2で右、colchk=3で両方タッチされたことを表しています。
タッチ処理部分を全部載せると長すぎたので、Action_moveのところを抜粋しました。
ttx[]とtty[]は使っていません、名残りです。

試したこと

getX(),getY()の()の中を、indexとし、
index=event.findPointerIndex(cnt);にする。
index=event.getPointerId(cnt);にする。

新たに調べて出てきたこと

試したこと、に書いてあることの他に
int index = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
が出てきました。
※いろいろなサイトを調べていますが引数の中身がどれも違っていて確実な情報がつかめません。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/02/08 00:15

    このコードからやりたいことがあまり読み取れません。winHとかwinWは画面の高さ・幅でしょうか?それとcolchkがどういう意図の変数なのかわかりません。

    キャンセル

  • ko20vonobird

    2017/02/08 02:09

    このコードは文字数制限上ほんの一部しか抜粋できていないので、追加で実現したいことに書かせていただきました。最終的には左右で指の座標の位置等をそれぞれ検出し、それが描画領域に含まれているか等含めて処理できれば良いと考えています。winH、winWは画面の高さ・幅で合っています。colchkの意図は補足にも書かせていただきましたが1,2,3で左がタッチされている、右がタッチされている、両方がタッチされていることを表しています。

    キャンセル

回答 2

check解決した方法

0

if(fingnum == 1){}のところでtx,tyを取得するのが抜けていたので記述しました。また、恐らくなのですが、リファレンスを調べたところ、
event.getX(event.findPointerIndex(event.getPointerId(0-指の数)))が正しい記法だということなので、これにしたところ、左右逆転や要素数オーバーのエラーが解消されました。
以上が自己解決方法です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-4

人のソースコードなんか仕事でなきゃ読みたかないんで、よく見ていません。
パッと思いついたことです。

MotionEventのリファレンスに書かれている、この話ではないですか。

 The order in which individual pointers appear within a motion event is undefined. Thus the pointer index of a pointer can change from one event to the next but the pointer id of a pointer is guaranteed to remain constant as long as the pointer remains active. Use the getPointerId(int) method to obtain the pointer id of a pointer to track it across all subsequent motion events in a gesture. Then for successive motion events, use the findPointerIndex(int) method to obtain the pointer index for a given pointer id in that motion event.

Google翻訳。

モーションイベント内に個々のポインタが現れる順序は定義されていません。 したがって、ポインタのポインタインデックスは、あるイベントから次のイベントに変化する可能性がありますが、ポインタのポインタIDは、ポインタがアクティブのままである限り一定であることが保証されます。 getPointerId(int)メソッドを使用して、ポインターのポインターIDを取得し、ジェスチャー内のすべての後続のモーションイベントにわたってそのポインターを追跡します。 次に、連続するモーションイベントに対して、findPointerIndex(int)メソッドを使用して、そのモーションイベント内の指定されたポインタidのポインタインデックスを取得します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/08 21:01

    回答ありがとうございます。findPointerIndex()を使用してみたりしましたが改善はされませんでした。
    あと、人のソースコードなんか仕事でなきゃ読みたかない、とありますが、人を不快にさせ、また、質問に真摯に取り組む姿勢が欠けていることからモラルに反しているとみなし、運営に通報し、また、低評価をさせていただきます。

    キャンセル

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

  • Java

    15549questions

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

  • Android

    7179questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。