[Androidアプリ開発]タッチ中は処理を継続させる

Android

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;
    }
}

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

コメント

タイトルとURLをコピーしました