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

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

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

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

Q&A

解決済

1回答

4326閲覧

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

yuji38kwmt

総合スコア437

Android

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

0グッド

0クリップ

投稿2017/05/04 04:23

編集2017/05/04 13:53

Android勉強中です。

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

Emulator

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

開発環境

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

AVDManger

ソース

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

java:PuzzleGame.java

1package com.example.yuji3.puzzlegame; 2 3import android.app.Activity; 4import android.os.Bundle; 5import android.view.Window; 6import android.view.WindowManager; 7 8public class PuzzleGame extends Activity { 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 Util.setActivity(this); 14 15 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 16 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 17 18 requestWindowFeature(Window.FEATURE_NO_TITLE); 19 20 setContentView(new PuzzleView(this)); 21 22 } 23}

java:PuzzleView.java

1package com.example.yuji3.puzzlegame; 2 3import android.app.Activity; 4import android.graphics.Bitmap; 5import android.graphics.Canvas; 6import android.graphics.Color; 7import android.graphics.Point; 8import android.graphics.Rect; 9import android.view.MotionEvent; 10import android.view.View; 11 12import lombok.EqualsAndHashCode; 13 14/** 15 * Created by yuji3 on 2017/05/03. 16 */ 17 18public class PuzzleView extends View { 19 20 public final static int SIZE = 4; 21 22 23 private final int EMPTY_NO = SIZE*SIZE-1; 24 25 26 27 public int W; 28 public int H; 29 30 31 private Scene scene = Scene.TITLE; 32 33 private int[][] data = new int[SIZE][SIZE]; 34 35 36 private int shufle; 37 38 private Graphics g; 39 private Rect gSrc; 40 private Rect gDst; 41 42 private Bitmap imgBg; 43 private Bitmap imgFrame; 44 private Bitmap imgPic; 45 private Bitmap imgTitle; 46 private Bitmap imgTap; 47 private Bitmap imgClear; 48 49 50 public PuzzleView(Activity activity) { 51 super(activity); 52 53 imgBg = Util.res2bmp(R.drawable.bg); 54 imgFrame = Util.res2bmp(R.drawable.frame); 55 imgPic = Util.res2bmp(R.drawable.pic); 56 imgTitle = Util.res2bmp(R.drawable.title); 57 imgTap = Util.res2bmp(R.drawable.tap); 58 imgClear = Util.res2bmp(R.drawable.clear); 59 60 W = imgBg.getWidth(); 61 H = imgBg.getHeight(); 62 63 Point displaySize = Util.getDisplaySize(); 64 int srcH = W * displaySize.y / displaySize.x; 65 66 int top = (H - srcH)/2; 67 gSrc = new Rect(0, top, W, top + srcH); 68 gDst = new Rect(0, 0, displaySize.x, displaySize.y); 69 70 g = new Graphics(W, H); 71 72 initScene(Scene.TITLE); 73 74 75 } 76 77 private void initScene(Scene scene) { 78 this.scene = scene; 79 80 switch (scene) { 81 case TITLE: 82 for (int i = 0; i < SIZE; i++) { 83 for (int j = 0; j < SIZE; j++) { 84 data[i][j] = i * SIZE + j; 85 } 86 } 87 break; 88 89 case PLAY: 90 shufle = 40; 91 while (shufle > 0) { 92 if (movePiece(new Cell(Util.rand(SIZE), Util.rand(SIZE)))) { 93 shufle--; 94 } 95 } 96 break; 97 98 default: 99 break; 100 101 102 } 103 104 invalidate(); 105 } 106 107 108 @Override 109 protected void onDraw(Canvas canvas) { 110 int PIECE_PIXEL = imgPic.getWidth()/SIZE; 111 112 g.drawBitmap(imgBg, 0, 0); 113 g.drawBitmap(imgFrame, (W-imgFrame.getWidth())/2, (H-imgFrame.getHeight())/2); 114 115 int px = (W-imgPic.getWidth())/2; 116 int py = (H-imgPic.getHeight())/2; 117 118// for (int ) 119 120 121 for(int i=0; i< SIZE; i++) { 122 for (int j=0; j<SIZE; j++) { 123 124 if (scene != Scene.PLAY || data[i][j] != EMPTY_NO ) { 125 int dx = j; 126 int dy = i; 127 128 int sx = data[i][j] % SIZE; 129 int sy = data[i][j] / SIZE; 130 131 Rect src = new Rect(PIECE_PIXEL * sx, PIECE_PIXEL * sy, PIECE_PIXEL * sx + PIECE_PIXEL, PIECE_PIXEL * sy + PIECE_PIXEL); 132 int dstLeft = px + PIECE_PIXEL * dx; 133 int dstTop = py + PIECE_PIXEL * dy; 134 Rect dst = new Rect(dstLeft, dstTop, dstLeft + PIECE_PIXEL, dstTop + PIECE_PIXEL); 135 136 g.drawBitmap(imgPic, src, dst); 137 138 } 139 140 } 141 } 142 143 switch(scene) { 144 case TITLE: 145 g.drawBitmap(imgTitle, (W-imgTitle.getWidth())/2, 120); 146 g.drawBitmap(imgTap, (W-imgTap.getWidth())/2, 1100); 147 break; 148 case CLEAR: 149 g.drawBitmap(imgClear,(W-imgClear.getWidth())/2, 120); 150 break; 151 default: 152 break; 153 } 154 155 canvas.drawColor(Color.BLACK); 156 canvas.drawBitmap(g.getBitmap(), gSrc, gDst, null); 157 158 } 159 160 161 @Override 162 public boolean onTouchEvent(MotionEvent event) { 163 int PIECE_PIXEL = imgPic.getWidth()/SIZE; 164 165 int touchX = (int) (event.getX() * gSrc.width() / gDst.width()); 166 int touchY = (int) (event.getY() * gSrc.height() / gDst.height()); 167 168 if (event.getAction() == MotionEvent.ACTION_DOWN) { 169 switch(scene) { 170 case TITLE: 171 initScene(Scene.PLAY); 172 break; 173 174 case PLAY: 175 int px = (W-imgPic.getWidth())/2; 176 int py = (H - imgPic.getHeight())/2; 177 178 if (px < touchX && touchX < px + imgPic.getWidth() && 179 py < touchY && touchY < py + imgPic.getHeight()) { 180 int tx = (touchX - px) / PIECE_PIXEL; 181 int ty = (touchY - py) / PIECE_PIXEL; 182 183 movePiece(new Cell(ty, tx)); 184 185 clearCheck(); 186 187 } 188 break; 189 190 case CLEAR: 191 initScene(Scene.TITLE); 192 break; 193 } 194 195 return true; 196 } 197 198 return super.onTouchEvent(event); 199 } 200 201 private boolean movePiece(Cell target) { 202 Cell empty = getEmptyCell(); 203 if (target.equals(empty)) { 204 return false; 205 } 206 207 if ( (target.row == empty.row && Math.abs(target.col-empty.col) <= 1) || 208 (target.col == empty.col && Math.abs(target.row - empty.row) <=1)) { //隣り合わせの場合 209 data[empty.row][empty.col] = data[target.row][target.col]; 210 data[target.row][target.col] = EMPTY_NO; 211 212 213 return true; 214 } else { 215 return false; 216 } 217 } 218 219 private enum Scene { 220 TITLE,PLAY,CLEAR 221 } 222 223 private Cell getEmptyCell() { 224 for(int i=0; i< SIZE; i++) { 225 for (int j=0; j<SIZE; j++) { 226 if (data[i][j] == EMPTY_NO) { 227 return new Cell(i, j); 228 } 229 } 230 } 231 return null; 232 } 233 234 @EqualsAndHashCode 235 class Cell { 236 Cell(int row, int col) { 237 this.row = row; 238 this.col = col; 239 } 240 int row = 0; 241 int col = 0; 242 } 243 244 245 private boolean clearCheck() { 246 if (shufle > 0) { 247 return true; 248 } 249 250 int count = 0; 251 for(int i=0; i< SIZE; i++) { 252 for (int j=0; j<SIZE; j++) { 253 if (data[i][j] == i*SIZE + j) { 254 count++; 255 } 256 } 257 } 258 259 if (count == SIZE*SIZE ) { 260 scene = Scene.CLEAR; 261 invalidate(); 262 return true; 263 } else { 264 invalidate(); 265 return false; 266 } 267 268 } 269}

xml:AndroidManifest.xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.yuji3.puzzlegame"> 4 5 <application 6 android:allowBackup="true" 7 android:icon="@mipmap/ic_launcher" 8 android:label="@string/app_name" 9 android:roundIcon="@mipmap/ic_launcher_round" 10 android:supportsRtl="true" 11 android:theme="@style/AppTheme"> 12 <activity android:name=".PuzzleGame" 13 android:label="@string/app_name" 14 android:screenOrientation="portrait"> 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 18 <category android:name="android.intent.category.LAUNCHER" /> 19 </intent-filter> 20 </activity> 21 </application> 22 23</manifest>

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

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

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

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

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

yona

2017/05/04 11:17

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

2017/05/04 13:11

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

2017/05/04 13:16

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

2017/05/04 13:54

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

回答1

0

ベストアンサー

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

ん・ぱか氏の本ですね

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

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

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

問題ないですね

投稿2017/05/07 04:23

aja

総合スコア3733

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

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

yuji38kwmt

2017/05/18 11:57

ありがとうございます。 新しいプロジェクトを作成したところ、ズレずに表示されました。 ちなみに、import lombok.EqualsAndHashCode; はlombokというライブラリで、自分で導入しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問