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;
}
}
今回は以上です。
画面に変化はありませんが、タップしてから指を離すまで移動し続けるようになりました。
次回は画面端に移動した際のストッパーを実装します。



コメント