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

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

ただいまの
回答率

90.50%

  • Android

    7307questions

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

Androidのエミュレータで表示部分がずれる

解決済

回答 1

投稿 編集

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

yuji38kwmt

score 427

Android勉強中です。

エミュレータで実行すると、下図のように、表示部分がずれています。
また、表示部分がずれているため、タッチしたときの座標が正しく取得できません。

Emulator

どこを修正すれば、正しく表示されるでしょうか?

 開発環境

  • Android Studio2.3.1
  • AVD Manager Galaxy Nexus API 25

AVDManger

 ソース

Android プログラミングバイブル のサンプルコードです。

package com.example.yuji3.puzzlegame;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class PuzzleGame extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Util.setActivity(this);

        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(new PuzzleView(this));

    }
}
package com.example.yuji3.puzzlegame;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;

import lombok.EqualsAndHashCode;

/**
 * Created by yuji3 on 2017/05/03.
 */

public class PuzzleView extends View {

    public final static int SIZE = 4;


    private final int EMPTY_NO = SIZE*SIZE-1;



    public   int W;
    public   int H;


    private Scene scene = Scene.TITLE;

    private int[][] data = new int[SIZE][SIZE];


    private int shufle;

    private Graphics g;
    private Rect gSrc;
    private Rect gDst;

    private Bitmap imgBg;
    private Bitmap imgFrame;
    private Bitmap imgPic;
    private Bitmap imgTitle;
    private Bitmap imgTap;
    private Bitmap imgClear;


    public PuzzleView(Activity activity) {
        super(activity);

        imgBg = Util.res2bmp(R.drawable.bg);
        imgFrame = Util.res2bmp(R.drawable.frame);
        imgPic = Util.res2bmp(R.drawable.pic);
        imgTitle = Util.res2bmp(R.drawable.title);
        imgTap = Util.res2bmp(R.drawable.tap);
        imgClear = Util.res2bmp(R.drawable.clear);

        W = imgBg.getWidth();
        H = imgBg.getHeight();

        Point displaySize = Util.getDisplaySize();
        int srcH = W * displaySize.y / displaySize.x;

        int top = (H - srcH)/2;
        gSrc = new Rect(0, top, W, top + srcH);
        gDst = new Rect(0, 0, displaySize.x, displaySize.y);

        g = new Graphics(W, H);

        initScene(Scene.TITLE);


    }

    private void initScene(Scene scene) {
        this.scene = scene;

        switch (scene) {
            case TITLE:
                for (int i = 0; i < SIZE; i++) {
                    for (int j = 0; j < SIZE; j++) {
                        data[i][j] = i * SIZE + j;
                    }
                }
                break;

            case PLAY:
                shufle = 40;
                while (shufle > 0) {
                    if (movePiece(new Cell(Util.rand(SIZE), Util.rand(SIZE)))) {
                        shufle--;
                    }
                }
                break;

            default:
                break;


        }

        invalidate();
    }


    @Override
    protected void onDraw(Canvas canvas) {
        int PIECE_PIXEL = imgPic.getWidth()/SIZE;

        g.drawBitmap(imgBg, 0, 0);
        g.drawBitmap(imgFrame, (W-imgFrame.getWidth())/2, (H-imgFrame.getHeight())/2);

        int px = (W-imgPic.getWidth())/2;
        int py = (H-imgPic.getHeight())/2;

//        for (int )


        for(int i=0; i< SIZE; i++) {
            for (int j=0; j<SIZE; j++) {

                if (scene != Scene.PLAY || data[i][j] != EMPTY_NO ) {
                    int dx = j;
                    int dy = i;

                    int sx = data[i][j] % SIZE;
                    int sy = data[i][j] / SIZE;

                    Rect src = new Rect(PIECE_PIXEL * sx, PIECE_PIXEL * sy, PIECE_PIXEL * sx + PIECE_PIXEL, PIECE_PIXEL * sy + PIECE_PIXEL);
                    int dstLeft = px + PIECE_PIXEL * dx;
                    int dstTop = py + PIECE_PIXEL * dy;
                    Rect dst = new Rect(dstLeft, dstTop, dstLeft + PIECE_PIXEL, dstTop + PIECE_PIXEL);

                    g.drawBitmap(imgPic, src, dst);

                }

            }
        }

        switch(scene) {
            case TITLE:
                g.drawBitmap(imgTitle, (W-imgTitle.getWidth())/2, 120);
                g.drawBitmap(imgTap, (W-imgTap.getWidth())/2, 1100);
                break;
            case CLEAR:
                g.drawBitmap(imgClear,(W-imgClear.getWidth())/2, 120);
                break;
            default:
                break;
        }

        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(g.getBitmap(), gSrc, gDst, null);

    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int PIECE_PIXEL = imgPic.getWidth()/SIZE;

        int touchX = (int) (event.getX() * gSrc.width() / gDst.width());
        int touchY = (int) (event.getY() * gSrc.height() / gDst.height());

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            switch(scene) {
                case TITLE:
                    initScene(Scene.PLAY);
                    break;

                case PLAY:
                    int px = (W-imgPic.getWidth())/2;
                    int py = (H - imgPic.getHeight())/2;

                    if (px < touchX && touchX < px + imgPic.getWidth() &&
                            py < touchY && touchY <  py + imgPic.getHeight()) {
                        int tx = (touchX - px) / PIECE_PIXEL;
                        int ty = (touchY - py) / PIECE_PIXEL;

                        movePiece(new Cell(ty, tx));

                        clearCheck();

                    }
                    break;

                case CLEAR:
                    initScene(Scene.TITLE);
                    break;
            }

            return true;
        }

        return super.onTouchEvent(event);
    }

    private boolean movePiece(Cell target) {
        Cell empty = getEmptyCell();
        if (target.equals(empty)) {
            return false;
        }

        if ( (target.row == empty.row && Math.abs(target.col-empty.col) <= 1) ||
                (target.col == empty.col && Math.abs(target.row - empty.row) <=1)) { //隣り合わせの場合
            data[empty.row][empty.col] = data[target.row][target.col];
            data[target.row][target.col] = EMPTY_NO;


            return true;
        } else {
            return false;
        }
    }

    private enum Scene {
        TITLE,PLAY,CLEAR
    }

    private Cell getEmptyCell() {
        for(int i=0; i< SIZE; i++) {
            for (int j=0; j<SIZE; j++) {
                if (data[i][j] == EMPTY_NO) {
                    return new Cell(i, j);
                }
            }
        }
        return null;
    }

    @EqualsAndHashCode
    class Cell {
        Cell(int row, int col) {
            this.row = row;
            this.col = col;
        }
        int row = 0;
        int col = 0;
    }


    private boolean clearCheck() {
        if (shufle > 0) {
            return true;
        }

        int count = 0;
        for(int i=0; i< SIZE; i++) {
            for (int j=0; j<SIZE; j++) {
                if (data[i][j] == i*SIZE + j) {
                    count++;
                }
            }
        }

        if (count == SIZE*SIZE ) {
            scene = Scene.CLEAR;
            invalidate();
            return true;
        } else {
            invalidate();
            return false;
        }

    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yuji3.puzzlegame">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".PuzzleGame"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • yona

    2017/05/04 20:17

    実装方法や使用クラスがわからないと回答のしようがありません。

    キャンセル

  • yuji38kwmt

    2017/05/04 22:11

    失礼しました。とりあえずAndroid StudioのバージョンとAVDMangerの環境を書きました。他にどのような情報が必要ですか?

    キャンセル

  • yona

    2017/05/04 22:16

    AndroidStudioの設定内容ではなく、あなたが実装したコードの詳細を書いてください。

    キャンセル

  • yuji38kwmt

    2017/05/04 22:54

    Activityなどメインのコードを記載しました。他に足りない情報はありませんか?

    キャンセル

回答 1

checkベストアンサー

0

Android プログラミングバイブル のサンプルコードです。

ん・ぱか氏の本ですね

考えられることとしては
Graphics 
Util
クラスをサンプルから変えてしまったのではないでしょうか

import lombok.EqualsAndHashCode;
これが何かは多分本に記述されているのでしょうけれど
変更しませんでしたか?

私はここをコメントアウトして
実際のダウンロードサンプルを動かしてみました
イメージ説明

問題ないですね

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/18 20:57

    ありがとうございます。
    新しいプロジェクトを作成したところ、ズレずに表示されました。

    ちなみに、import lombok.EqualsAndHashCode; はlombokというライブラリで、自分で導入しました。

    キャンセル

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

  • Android

    7307questions

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