Androidアプリ開発の3回目になります。
画面の横スクロール移動ができた後の続きになります。
- 使用言語 java
- 開発ツール AndroidStudio
前回の実装では横スクロールは出来るものの
スクロールをさせるためには画面タップを繰り返さなければならないため、
今回はそこを改善します。
今回の変更点
- StageクラスにRunnableインターフェースを実装
- 画面描画用メソッドをMapクラスに移動
- Stageクラスのrunメソッドから画面描画メソッドを呼び出し
- 画面タップで横移動用の変数に加算する値を調整
package com.example.dbd.daybyday; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class Stage extends SurfaceView implements SurfaceHolder.Callback, Runnable { Map map; //Mapクラスの参照保持変数 //Paint paint; //Color保持用 SurfaceHolder holder; //ディスプレイ編集・監視用インターフェース //int[][] mapArray; //表示マップ保持用 //int xx = 0; //表示マップ横位置保持 //画面変更時の処理 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){} //画面破棄時の処理 @Override public void surfaceDestroyed(SurfaceHolder holder){} //画面作成時の処理 @Override public void surfaceCreated(SurfaceHolder holder){ //Mapクラスのインスタンス生成 //画面幅,画面高さを取得 コンストラクタの処理の後なら取得可能 map = new Map(super.getWidth(), super.getHeight(),this); //mapArray = map.getMap(); //map配列取得 //paint = new Paint(); //paint.setColor(Color.GREEN); Thread thread = new Thread(this); thread.start(); //draw(); //描画用自クラスメソッド } //画面にタッチすると動くメソッド @Override public boolean onTouchEvent(MotionEvent event){ float touchX = event.getX(); //タッチ位置取得 //画面に指を置いたタイミングで条件分岐処理 switch (event.getAction()){ case MotionEvent.ACTION_DOWN : //タッチ位置が画面の右側ならxxをインクリメント if(touchX > super.getWidth() / 2){ map.xxPlus = 1; }else{ //それ以外はデクリメント map.xxPlus = -1; } break; case MotionEvent.ACTION_UP : map.xxPlus = 0; break; } //draw(); //画面再描画 return true; } //コンストラクタ public Stage(Context context){ super(context); //この処理でsurfaceCreatedメソッドが動きます holder = super.getHolder(); holder.addCallback(this); } @Override public void run(){ map.draw(); } /* //描画用メソッド private void draw(){ Canvas canvas = holder.lockCanvas(); //画面をロックして canvas.drawColor(Color.WHITE); //画面をクリア //描画ドット数繰り返す for(int y = 0; y < map.getROWCOUNT(); y++){ for(int x = 0; x < map.getCOLUMNCOUNT(); x++){ switch (mapArray[y][x + xx]){ //xxが描画開始インデックスを調整 case 1: //配列の値が1の場合は float drawX = x * map.getDotX(); //描画開始位置のX座標を設定 float drawY = y * map.getDotY(); //描画開始位置の座標を設定 canvas.drawRect(drawX,drawY,drawX + map.getDotX(), drawY + map.getDotY(),paint); break; } } } holder.unlockCanvasAndPost(canvas); //画面に変更反映 } */ }
package com.example.dbd.daybyday; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; public class Map { private final int ROWCOUNT = 20; //縦表示ドット数 private final int COLUMNCOUNT = 10; //横表示ドット数 private float dotX; //1ドットの横幅 private float dotY; //1ドットの縦幅 private Stage stage; //描画用にstageクラスの参照保持 private Paint paint; //色保持用 int xx; //横位置保持用 int xxPlus; //変数xx加算用 //表示マップの2次元配列 private int[][] map = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; //コンストラクタ //画面サイズを引数で受け取り、ドットサイズを設定 public Map(float viewX, float viewY,Stage stage){ this.stage = stage; dotX = viewX / COLUMNCOUNT; dotY = viewY / ROWCOUNT; paint = new Paint(); paint.setColor(Color.GREEN); } public void draw(){ while(true) { xx += xxPlus; //横移動 Canvas canvas = stage.holder.lockCanvas(); //画面をロックして canvas.drawColor(Color.WHITE); //画面をクリア //描画ドット数繰り返す for (int y = 0; y < ROWCOUNT; y++) { for (int x = 0; x < COLUMNCOUNT; x++) { switch (map[y][x + xx]) { //xxが描画開始インデックスを調整 case 1: //配列の値が1の場合は float drawX = x * dotX; //描画開始位置のX座標を設定 float drawY = y * dotY; //描画開始位置の座標を設定 canvas.drawRect(drawX, drawY, drawX + dotX, drawY + dotY, paint); break; } } } stage.holder.unlockCanvasAndPost(canvas); //画面に変更反映 } } //以下はゲッター public int getROWCOUNT() { return ROWCOUNT; } public int getCOLUMNCOUNT() { return COLUMNCOUNT; } public float getDotX() { return dotX; } public float getDotY() { return dotY; } public int[][] getMap() { return map; } }
今回は以上です。
画面に変化はありませんが、タップしてから指を離すまで移動し続けるようになりました。
次回は画面端に移動した際のストッパーを実装します。
コメント