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

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

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

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

Android

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

Q&A

解決済

1回答

1293閲覧

仮想端末と実機で当たり判定のズレが生じます

ko20vonobird

総合スコア50

Java

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

Android

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

0グッド

0クリップ

投稿2017/04/24 13:24

編集2017/04/25 15:32

いつも仮想端末でプログラムを実行して調整などをしているのですが、それを実機で実行した時に同じプログラムのはずなのに当たり判定にズレが生じてしまいます。(左上にずれていたかと思います。)
どうすればズレなくなるのでしょうか?
###備考
・ステータスバーなどをなくしてます。
・左右反転させた元になるカスタムビューに対するタッチイベントは仮想端末でも実機でも正常です。
###情報追記
・仮想端末解像度:480×800: hdpi
・実機解像度:フルHD:1080×1920
・どのようにタッチを取得しているかわかるコード

java

1//Activity側で取得 2@Override 3 public boolean onTouchEvent(MotionEvent event) { 4 int index; 5 baab = 0; 6 Ochk = ""; 7 Hchk = ""; 8 Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 9 switch (event.getAction() & MotionEvent.ACTION_MASK) { ///MotionEventCompat.getActionMasked(event) 10 case MotionEvent.ACTION_DOWN: 11 colchk = 0; 12 fingnum = event.getPointerCount(); 13 // タッチされている数だけ処理を行う。 14 for (int cnt = 0; cnt < fingnum; cnt++) { 15 pid = event.getPointerId(cnt); 16 index = event.findPointerIndex(pid); 17 tx = event.getX(index); 18 ty = event.getY(index); 19//---以下省略

・どのように当たり判定をしているか分かるコード

java

1public boolean Rightyoshite(float x, float y, float c1r, float c2r) {//righty=右利き,lefty=左利き 2 if (((y >= ((-1 * x) / 0.8105067459f) + (winW / (5 * 0.8105067459f)) + ((winW * 0.8105067459f) / 5) + (winW * 0.1473648629f) - (winH / 8)) && 3 (y <= ((-1 * x) / 0.8105067459f) + ((winW * 3.8f) / (12 * 0.8105067459f)) + ((winW * 3.8f * 0.8105067459f) / 12) + (winW * 0.1473648629f) - (winH / 8)) && 4 (y <= ((winH * x * 66) / (winW * 40)) + ((winH * 7) / 40)) && 5 (y >= (((winH * x * 7) / 24) / (((winW * 9.1f) / 44) + (winH / 10))) - (winH / 8) + ((((winH * 7) / 24) / (((winW * 9.1f) / 44) + (winH / 10))) * (winW / 5.5f)))) 6 || Math.sqrt(Math.pow(x - (winW / 5), 2) + Math.pow(y - (((winW * 0.8105067459f) / 5) + (winW * 0.1473648629f) - (winH / 8)), 2)) <= c1r || 7 Math.sqrt(Math.pow(x - ((winW * 3.8) / 12), 2) + Math.pow(y - (((winW * 3.8f * 0.8105067459f) / 12) + (winW * 0.1473648629f) - (winH / 8)), 2)) <= c2r){ 8 Log.d("true", "right"); 9 return true; 10 } 11 String lc1r = String.valueOf(c1r); 12 Log.d("c1r", lc1r); 13 Log.d("false", "right"); 14 return false; 15 } 16//略 17//以下略

タッチイベント内の当たり判定呼び出し部分

java

1//onTouch内 2if (colchk == 0) { 3 //new 4 if (LR.equals("right")) { 5 if (Rightyoshite(tx, ty, dg.getC1r(), dg.getC2r())) { 6 Ochk = "Oshite"; 7 } 8 if (Rightyhikite(tx, ty, dg.getC3r(), dg.getC4r())) { 9 Hchk = "Hikite"; 10 } 11 } 12 if (LR.equals("left")) { 13 if (Leftyoshite(tx, ty, dgl.getC1r(), dgl.getC2r())) { 14 Ochk = "Oshite"; 15 } 16 if (Leftyhikite(tx, ty, dgl.getC3r(), dgl.getC4r())) { 17 Hchk = "Hikite"; 18 } 19 }

・図形の描画コード**(文字数制限のため、抽出してます)**

java

1 bx = (((winW / (5 * 0.8105067459f)) + ((winW * 0.8105067459f) / 5) + (winW * 0.1473648629f) - (winH / 8) + (winH / 8) - ((((winH * 7) / 24) / (((winW * 9.1f) / 44) + (winH / 10))) * (winW / 5.5f))) / (((winH * 7) / 24) / ((((winW * 9.1f) / 44) + (winH / 10))) + (1 / 0.8105067459f))); 2 by = ((((winH * 7) / 24) * bx) / (((winW * 9.1f) / 44) + (winH / 10))) - (winH / 8) + ((((winH * 7) / 24) / (((winW * 9.1f) / 44) + (winH / 10))) * (winW / 5.5f)); 3 //cx = ((((winW * 3.8f) / (12 * 0.8105067459f)) + ((winW * 3.8f * 0.8105067459f) / 12) + (winW * 0.1473648629f) - ((winH * 7) / 40) - (winH / 8)) / (((winH * 66) / (winW * 40)) + (1 / 0.8105067459f))); 4 //cy = ((winH * 66 * cx) / (winW * 40)) + ((winH * 7) / 40); 5 dx = ((((winW * 3.8f) / (12 * 0.8105067459f)) + ((winW * 3.8f * 0.8105067459f) / 12) + (winW * 0.1473648629f) - (winH / 8) + (winH / 8) - ((((winH * 7) / 24) / (((winW * 9.1f) / 44) + (winH / 10))) * (winW / 5.5f))) / (((winH * 7) / 24) / ((((winW * 9.1f) / 44) + (winH / 10))) + (1 / 0.8105067459f))); 6 dy = ((((winH * 7 * dx) / 24)) / (((winW * 9.1f) / 44) + (winH / 10))) - (winH / 8) + ((((winH * 7) / 24) / (((winW * 9.1f) / 44) + (winH / 10))) * (winW / 5.5f)); 7 axa = (winW / (5 * 0.8105067459f)); 8 axb = ((winW * 0.8105067459f) / 5); 9 axc = winW * 0.1473648629f; 10 axd = ((winH * 7) / 40); 11 axe = winH / 8; 12 axf = axa + axb + axc - axd - axe;//分子 13 axg = ((winH * 66) / (winW * 40)); 14 axh = 1.0f / 0.8105067459f; 15 axi = axg + axh;//分母 16 //ax = axf / axi; 17 aya = axg; 18 ayb = aya * ax; 19 ayc = axd; 20 //ay = ayb + ayc; 21 cxa = ((winW * 3.8f) / (12 * 0.8105067459f)); 22 cxb = ((winW * 3.8f * 0.8105067459f) / 12); 23 cxc = winW * 0.1473648629f; 24 cxd = ((winH * 7) / 40); 25 cxe = winH / 8; 26 cxf = cxa + cxb + cxc - cxd - cxe;//分子 27 cxg = ((winH * 66) / (winW * 40)); 28 cxh = 1.0f / 0.8105067459f; 29 cxi = cxg + cxh;//分母 30 //cx = cxf / cxi; 31 cya = cxg; 32 cyb = cya * cx; 33 cyc = cxd; 34 //cy = cyb + cyc; 35 zax = Math.abs(bx - c1x); 36 zay = Math.abs(by - c1y); 37 zbx = Math.abs(dx - c2x); 38 zby = Math.abs(dy - c2y); 39 ax = c1x - zax; 40 ay = c1y + zay; 41 cx = c2x - zbx; 42 cy = c2y + zby; 43 beta = ((winW * 6.5f) / (12 * 0.524455263f)) + ((winW * 6.5f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8); 44 alpha = ((winW * 10.0f) / (12 * 0.524455263f)) + ((winW * 10.0f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8); 45 c3a = (winW * 6.5f) / 12; 46 c3b = ((winW * 6.5f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8); 47 c3c = (float)(1 + Math.pow(1 / 0.524455263f, 2)); 48 c4a = (winW * 10.0f) / 12; 49 c4b = ((winW * 10.0f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8); 50 c4c = (float)(1 + Math.pow(1 / 0.524455263f, 2)); 51 pa1 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2)); //1:e,2:f,3:g,4:h 52 pa2 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2)); 53 pa3 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2)); 54 pa4 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2)); 55 pb1 = c3a + (beta / 0.524455263f) - (c3b / 0.524455263f); 56 pb2 = c3a + (beta / 0.524455263f) - (c3b / 0.524455263f); 57 pb3 = c4a + (alpha / 0.524455263f) - (c4b / 0.524455263f); 58 pb4 = c4a + (alpha / 0.524455263f) - (c4b / 0.524455263f); 59 pc1 = (float)(Math.pow(c3a, 2) + Math.pow(beta, 2) - (2 * c3b * beta) + Math.pow(c3b, 2) - Math.pow(c3r, 2)); 60 pc2 = (float)(Math.pow(c3a, 2) + Math.pow(beta, 2) - (2 * c3b * beta) + Math.pow(c3b, 2) - Math.pow(c3r, 2)); 61 pc3 = (float)(Math.pow(c4a, 2) + Math.pow(alpha, 2) - (2 * c4b * alpha) + Math.pow(c4b, 2) - Math.pow(c4r, 2)); 62 pc4 = (float)(Math.pow(c4a, 2) + Math.pow(alpha, 2) - (2 * c4b * alpha) + Math.pow(c4b, 2) - Math.pow(c4r, 2)); 63 ex = (float)((pb1 - Math.sqrt(Math.pow(pb1, 2) - (pa1 * pc1))) / pa1); 64 ey = (((-1) * ex) / 0.524455263f) + beta; 65 fx = (float)((pb2 + Math.sqrt(Math.pow(pb2, 2) - (pa2 * pc2))) / pa2); 66 fy = (((-1) * fx) / 0.524455263f) + beta; 67 gx = (float)((pb3 - Math.sqrt(Math.pow(pb3, 2) - (pa3 * pc3))) / pa3); 68 gy = (((-1) * gx) / 0.524455263f) + alpha; 69 hx = (float)((pb4 + Math.sqrt(Math.pow(pb4, 2) - (pa4 * pc4))) / pa4); 70 hy = (((-1) * hx) / 0.524455263f) + alpha;

###追記
マジックナンバーについて、もとはy=xなどの方程式です。なので、その意味は係数やそれに関係するものということになります。
スクリーンショット

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

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

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

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

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

masaya_ohashi

2017/04/25 02:34

仮想端末の解像度、実機の解像度、どのようにタッチを取得しているか分かるコード、どのように当たり判定をしているか分かるコードがないと答えられません。
masaya_ohashi

2017/04/25 04:21

図形を書いているコードもお願いします。
masaya_ohashi

2017/04/25 08:45

見てみましたが、見る気が失せるレベルで読みづらいです…せめて「マジックナンバー」はやめましょう。3.8fとか0.8105067459fとか言われても、その数字が何を意味したものかがわからないと読み解くことができません。また、描画の処理も肝心の座標計算のところがないのであまり参考になりません。
ko20vonobird

2017/04/25 09:45

こんにちは、文字数制限が10000文字という限界があるので、一部一部を抽出する形で質問させていただいてます。
guest

回答1

0

ベストアンサー

ボタンをPathとRegionを使ったViewの派生(?)として設計し、ヒット判定はこのViewのRegionにまかせるというやり方の方がよいのではないでしょうか?

こんなページをみてそう思ったのですが・・・

Android暗いので外してたらすみません。

投稿2017/04/25 13:17

KSwordOfHaste

総合スコア18392

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

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

ko20vonobird

2017/04/25 15:03

回答ありがとうございます。このRegionなどは当たっているかどうかを判定するのに用いるように感じましたが、当たっている場所がどこらへんかなどを知ることはできないでしょうか?というのも、私は画像の黒い部分の当たり判定がtrueでかつ主にx座標を知って(y座標も考慮はします)その上でアクションを起こしたいのですが、できるものなのでしょうか?
KSwordOfHaste

2017/04/25 15:24

図形の外郭をPathが定義しており、描画はPathの内側を塗りつぶすことで行っていますね?そしてRegionの境界はそのPathにより定義しているように見えました。つまり描画されている図形の境界で自動的にHIT判定されていると自分は解釈しました。このように推測したのは他のGUIシステムでも同様の考え方の設計をみたことがあるからです。ただし自分はAndroidで実際にやったことがないので確認してみてください。
ko20vonobird

2017/04/26 04:36

これでやってみますね、回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問