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

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

ただいまの
回答率

88.91%

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

解決済

回答 1

投稿 編集

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

ko20vonobird

score 50

いつも仮想端末でプログラムを実行して調整などをしているのですが、それを実機で実行した時に同じプログラムのはずなのに当たり判定にズレが生じてしまいます。(左上にずれていたかと思います。)
どうすればズレなくなるのでしょうか?

備考

・ステータスバーなどをなくしてます。
・左右反転させた元になるカスタムビューに対するタッチイベントは仮想端末でも実機でも正常です。

情報追記

・仮想端末解像度:480×800: hdpi
・実機解像度:フルHD:1080×1920
・どのようにタッチを取得しているかわかるコード

//Activity側で取得
@Override
    public boolean onTouchEvent(MotionEvent event) {
        int index;
        baab = 0;
        Ochk = "";
        Hchk = "";
        Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
        switch (event.getAction() & MotionEvent.ACTION_MASK) { ///MotionEventCompat.getActionMasked(event)
            case MotionEvent.ACTION_DOWN:
                colchk = 0;
                fingnum = event.getPointerCount();
                // タッチされている数だけ処理を行う。
                for (int cnt = 0; cnt < fingnum; cnt++) {
                    pid = event.getPointerId(cnt);
                    index = event.findPointerIndex(pid);
                    tx = event.getX(index);
                    ty = event.getY(index);
//---以下省略


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

public boolean Rightyoshite(float x, float y, float c1r, float c2r) {//righty=右利き,lefty=左利き
        if (((y >= ((-1 * x) / 0.8105067459f) + (winW / (5 * 0.8105067459f)) + ((winW * 0.8105067459f) / 5) + (winW * 0.1473648629f) - (winH / 8)) &&
                (y <= ((-1 * x) / 0.8105067459f) + ((winW * 3.8f) / (12 * 0.8105067459f)) + ((winW * 3.8f * 0.8105067459f) / 12) + (winW * 0.1473648629f) - (winH / 8)) &&
                (y <= ((winH * x * 66) / (winW * 40)) + ((winH * 7) / 40)) &&
                (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))))
                || Math.sqrt(Math.pow(x - (winW / 5), 2) + Math.pow(y - (((winW * 0.8105067459f) / 5) + (winW * 0.1473648629f) - (winH / 8)), 2)) <= c1r ||
                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){
            Log.d("true", "right");
            return true;
        }
        String lc1r = String.valueOf(c1r);
        Log.d("c1r", lc1r);
        Log.d("false", "right");
        return false;
    }
//略
//以下略


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

//onTouch内
if (colchk == 0) {
                        //new
                        if (LR.equals("right")) {
                            if (Rightyoshite(tx, ty, dg.getC1r(), dg.getC2r())) {
                                Ochk = "Oshite";
                            }
                            if (Rightyhikite(tx, ty, dg.getC3r(), dg.getC4r())) {
                                Hchk = "Hikite";
                            }
                        }
                        if (LR.equals("left")) {
                            if (Leftyoshite(tx, ty, dgl.getC1r(), dgl.getC2r())) {
                                Ochk = "Oshite";
                            }
                            if (Leftyhikite(tx, ty, dgl.getC3r(), dgl.getC4r())) {
                                Hchk = "Hikite";
                            }
                        }


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

        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)));
        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));
        //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)));
        //cy = ((winH * 66 * cx) / (winW * 40)) + ((winH * 7) / 40);
        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)));
        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));
        axa = (winW / (5 * 0.8105067459f));
        axb = ((winW * 0.8105067459f) / 5);
        axc = winW * 0.1473648629f;
        axd = ((winH * 7) / 40);
        axe = winH / 8;
        axf = axa + axb + axc - axd - axe;//分子
        axg = ((winH * 66) / (winW * 40));
        axh = 1.0f / 0.8105067459f;
        axi = axg + axh;//分母
        //ax = axf / axi;
        aya = axg;
        ayb = aya * ax;
        ayc = axd;
        //ay = ayb + ayc;
        cxa = ((winW * 3.8f) / (12 * 0.8105067459f));
        cxb = ((winW * 3.8f * 0.8105067459f) / 12);
        cxc = winW * 0.1473648629f;
        cxd = ((winH * 7) / 40);
        cxe = winH / 8;
        cxf = cxa + cxb + cxc - cxd - cxe;//分子
        cxg = ((winH * 66) / (winW * 40));
        cxh = 1.0f / 0.8105067459f;
        cxi = cxg + cxh;//分母
        //cx = cxf / cxi;
        cya = cxg;
        cyb = cya * cx;
        cyc = cxd;
        //cy = cyb + cyc;
        zax = Math.abs(bx - c1x);
        zay = Math.abs(by - c1y);
        zbx = Math.abs(dx - c2x);
        zby = Math.abs(dy - c2y);
        ax = c1x - zax;
        ay = c1y + zay;
        cx = c2x - zbx;
        cy = c2y + zby;
        beta = ((winW * 6.5f) / (12 * 0.524455263f)) + ((winW * 6.5f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8);
        alpha = ((winW * 10.0f) / (12 * 0.524455263f)) + ((winW * 10.0f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8);
        c3a = (winW * 6.5f) / 12;
        c3b = ((winW * 6.5f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8);
        c3c = (float)(1 + Math.pow(1 / 0.524455263f, 2));
        c4a = (winW * 10.0f) / 12;
        c4b = ((winW * 10.0f * 0.524455263f) / 12) + (winW * 0.09535550236f) - (winH / 8);
        c4c = (float)(1 + Math.pow(1 / 0.524455263f, 2));
        pa1 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2)); //1:e,2:f,3:g,4:h
        pa2 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2));
        pa3 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2));
        pa4 = (float)(1 + Math.pow(1.0f / 0.524455263f, 2));
        pb1 = c3a + (beta / 0.524455263f) - (c3b / 0.524455263f);
        pb2 = c3a + (beta / 0.524455263f) - (c3b / 0.524455263f);
        pb3 = c4a + (alpha / 0.524455263f) - (c4b / 0.524455263f);
        pb4 = c4a + (alpha / 0.524455263f) - (c4b / 0.524455263f);
        pc1 = (float)(Math.pow(c3a, 2) + Math.pow(beta, 2) - (2 * c3b * beta) + Math.pow(c3b, 2) - Math.pow(c3r, 2));
        pc2 = (float)(Math.pow(c3a, 2) + Math.pow(beta, 2) - (2 * c3b * beta) + Math.pow(c3b, 2) - Math.pow(c3r, 2));
        pc3 = (float)(Math.pow(c4a, 2) + Math.pow(alpha, 2) - (2 * c4b * alpha) + Math.pow(c4b, 2) - Math.pow(c4r, 2));
        pc4 = (float)(Math.pow(c4a, 2) + Math.pow(alpha, 2) - (2 * c4b * alpha) + Math.pow(c4b, 2) - Math.pow(c4r, 2));
        ex = (float)((pb1 - Math.sqrt(Math.pow(pb1, 2) - (pa1 * pc1))) / pa1);
        ey = (((-1) * ex) / 0.524455263f) + beta;
        fx = (float)((pb2 + Math.sqrt(Math.pow(pb2, 2) - (pa2 * pc2))) / pa2);
        fy = (((-1) * fx) / 0.524455263f) + beta;
        gx = (float)((pb3 - Math.sqrt(Math.pow(pb3, 2) - (pa3 * pc3))) / pa3);
        gy = (((-1) * gx) / 0.524455263f) + alpha;
        hx = (float)((pb4 + Math.sqrt(Math.pow(pb4, 2) - (pa4 * pc4))) / pa4);
        hy = (((-1) * hx) / 0.524455263f) + alpha;

追記

マジックナンバーについて、もとはy=xなどの方程式です。なので、その意味は係数やそれに関係するものということになります。
![スクリーンショット](7750a4ff56bee5f1d46223e5f349d6ae.png)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • masaya_ohashi

    2017/04/25 11:34

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

    キャンセル

  • masaya_ohashi

    2017/04/25 13:21

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

    キャンセル

  • masaya_ohashi

    2017/04/25 17:45

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

    キャンセル

  • ko20vonobird

    2017/04/25 18:45

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/26 00:03

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

    キャンセル

  • 2017/04/26 00:24

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

    キャンセル

  • 2017/04/26 13:36

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

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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