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

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

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

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

Android

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

Q&A

解決済

2回答

1233閲覧

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

ko20vonobird

総合スコア50

Java

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

Android

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

0グッド

0クリップ

投稿2017/02/07 06:08

編集2017/02/08 10:25

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

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

###該当のソースコード

java

1case MotionEvent.ACTION_MOVE: 2 colchk = 0; 3 fingnum = event.getPointerCount(); 4 ttx = new float[fingnum]; 5 tty = new float[fingnum]; 6 if (fingnum > 1) { 7 for (int cnt = 0; cnt < fingnum; cnt++) { 8 pid = event.getPointerId(cnt); 9 tx = event.getX(cnt); 10 ty = event.getY(cnt); 11 ttx[cnt] = tx;//Data indexを基準とする 12 tty[cnt] = ty;//上に同じ 13 if (colchk == 0) { 14 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))) { 15 colchk = 1; 16 Log.d("hand", "left"); 17 } 18 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))) { 19 colchk = 2; 20 Log.d("hand", "right"); 21 } 22 } 23 if (colchk == 1) { 24 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))) { 25 colchk = 3; 26 Log.d("hand", "leftright"); 27 } 28 } 29 if (colchk == 2){ 30 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))) { 31 colchk = 3; 32 Log.d("hand", "leftright"); 33 } 34 } 35 if (colchk == 0) { 36 Log.d("hand", "none"); 37 } 38 } 39 } else if (fingnum == 1) { 40 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))) { 41 colchk = 1; 42 Log.d("hand", "left"); 43 } 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))) { 44 colchk = 2; 45 Log.d("hand", "right"); 46 } else { 47 Log.d("hand", "none"); 48 } 49 } 50 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;
が出てきました。
※いろいろなサイトを調べていますが引数の中身がどれも違っていて確実な情報がつかめません。

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

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

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

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

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

swordone

2017/02/07 15:15

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

2017/02/07 17:09

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

回答2

0

自己解決

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

投稿2017/02/09 05:20

ko20vonobird

総合スコア50

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

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

0

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

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/07 17:31

katsuko

総合スコア3469

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

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

ko20vonobird

2017/02/08 12:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問