###前提・実現したいこと
左右に角丸の長方形を描画して、それをタッチした状態の時に色々な処理をしたいです。
とりあえず今の段階ではマルチタッチが指定した領域でできるかのテストのようなものです。
最終的には、左右で一か所ずつタッチ状況を検知して、それをゲームに組み込みたいと思っています。
###発生している問題
度々、左をタッチしている状態なのに右を触っていると判定されたり、右をタッチしている状態なのに左を触っていると判定されたりします。
また、両方ともタッチしている状態で片方が角丸長方形の領域をタッチしていてもう片方が画面の外にタッチしたままずれると両方ともタッチしていないという判定になったりします。
さらに、タッチしたまま指をずらしていくと領域を離れているのにタッチしているという判定になったりします。
###該当のソースコード
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;
が出てきました。
※いろいろなサイトを調べていますが引数の中身がどれも違っていて確実な情報がつかめません。
回答2件
あなたの回答
tips
プレビュー