###前提
不具合なくマルチタッチを実現したいです。
###発生している問題
エラーメッセージはありません。
二本指(多指)でタッチしている時だけなのですが、片方を上げても、両方タッチしたままと判定されることが度々あります。
###該当のソースコード
念のためMotionEvent.ACTION_POINTER_UPの部分を抜粋して載せます。
colchkは左右どちらの領域がタッチされているかを表しています。
ttx,ttyは今は使用しておりません。fingidもです。
sc.colchange(),sc.colreturn()は領域の色を変えるためのメソッドを呼び出しています。
Java
1case MotionEvent.ACTION_POINTER_UP: 2 colchk = 0; 3 fingnum = event.getPointerCount(); 4 fingid = new int[fingnum]; 5 ttx = new float[fingnum]; 6 tty = new float[fingnum]; 7 //タッチ箇所が一本以上の時trueを返し、処理を行う。また、下にあるelseifで指が一本の時の処理もある。 8 if (fingnum > 1) { 9 //タッチされている数だけ処理を行う 10 for (int cnt = 0; cnt < fingnum; cnt++) { 11 pid = event.getPointerId(cnt); 12 index = event.findPointerIndex(pid); 13 tx = event.getX(index); 14 ty = event.getY(index); 15 //繰り返し回数一回目の時処理を行う 16 if (cnt == 0){ 17 textView1.setText("tx1:" + tx + " ty1:" + ty); 18 ltx = String.valueOf(tx); 19 lty = String.valueOf(ty); 20 Log.d("tx,ty", "tx:" + ltx + " ty:" + lty); 21 } 22 //繰り返し回数二回目の時処理を行う 23 if (cnt == 1){ 24 textView2.setText("tx2:" + tx + " ty2:" + ty); 25 ltx = String.valueOf(tx); 26 lty = String.valueOf(ty); 27 Log.d("tx,ty", "tx:" + ltx + " ty:" + lty); 28 } 29 ttx[cnt] = tx;//Data indexを基準とする 30 tty[cnt] = ty;//上に同じ 31 //何もタッチされていない初期状態の時処理を行う 32 if (colchk == 0) { 33 //指定領域かどうかを判定し、領域内でタッチされていたら処理を行う。 34 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))) { 35 colchk = 1; 36 sc.colchange(); 37 Log.d("hand", "left"); 38 } 39 //指定領域かどうかを判定し、領域内でタッチされていたら処理を行う。 40 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))) { 41 colchk = 2; 42 sc.colchange(); 43 Log.d("hand", "right"); 44 } 45 } 46 //左がタッチされている時に処理を行う。 47 if (colchk == 1) { 48 //指定領域かどうかを判定し、領域内でタッチされていたら処理を行う。 49 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))) { 50 colchk = 3; 51 sc.colchange(); 52 Log.d("hand", "leftright"); 53 } 54 } 55 //右がタッチされている時に処理を行う。 56 if (colchk == 2){ 57 //指定領域かどうかを判定し、領域内でタッチされていたら処理を行う。 58 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))) { 59 colchk = 3; 60 sc.colchange(); 61 Log.d("hand", "leftright"); 62 } 63 } 64 //何もタッチされていない時に処理を行う。 65 if (colchk == 0) { 66 sc.colreturn(); 67 Log.d("hand", "out"); 68 } 69 } 70 } else if (fingnum == 1) {//タッチ箇所が一か所の時処理を行う。 71 int cnt = 0; 72 pid = event.getPointerId(cnt); 73 index = event.findPointerIndex(pid); 74 tx = event.getX(index); 75 ty = event.getY(index); 76 textView1.setText("tx1:" + tx + " ty1:" + ty); 77 ltx = String.valueOf(tx); 78 lty = String.valueOf(ty); 79 Log.d("tx,ty", "tx:" + ltx + " ty:" + lty); 80 //指定領域かどうかを判定し、領域内でタッチされていたら処理を行う。 81 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))) { 82 colchk = 1; 83 sc.colchange(); 84 Log.d("hand", "left"); 85 //↓指定領域かどうかを判定し、領域内でタッチされていたら処理を行う。 86 } 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))) { 87 colchk = 2; 88 sc.colchange(); 89 Log.d("hand", "right"); 90 } else { 91 sc.colreturn(); 92 Log.d("hand", "out"); 93 } 94 } 95 break;
###試したり考えたりしたこと
ログ出力を試しましたがなぜか実機だとログ自体がなぜか出ません。
手汗が原因ではないかと思いましたが、比較対象がないため分かりません。
###補足情報
前回の質問の延長ですが、本質が違うと感じたので別の質問にしました。
マルチタッチなので実機でテストしています。
###追記
・ログはコード内にありますが、
Log.d("tx,ty", "tx:" + ltx + " ty:" + lty);で座標
Log.d("hand", "left");で左がタッチされている
Log.d("hand", "right");で右がタッチされている
Log.d("hand", "leftright");で左右がタッチされている
Log.d("hand", "out");でタッチされていない
ということを表しています。
・実機はAndroid 6.0のXperia z4です。
・マジックナンバー、指定領域について
→まず、winWとwinHは画面の幅と高さを表しています。そして、txとtyはタッチされた座標です。例えば、winW0.15fは画面幅の15%の位置を使用するという意味で、winW-(winW0.33f)は画面幅の右から33%の位置を使用するという意味です。これを使用する意図は、どんな画面幅になっても対応できるようにということから使用しています。
また、領域は角丸四角形なので、四隅の半径を短い方に合わせて円と長方形、そして円で表現できるようにしています。なので、powを使っているところは円の公式を用いているということになります。
回答2件
あなたの回答
tips
プレビュー