Android SurfaceView でカウントダウンタイマー実装
最近Androidでゲームアプリを作成してて、カウントダウンタイマーを実装する時にちょっと詰まったのでメモ。
/** * 制限時間を計算 */ public class CalcTime { private final int GAME_TIME = 30; private long mNowTime; private long mStartTime; public CalcTime() { this.mNowTime = GAME_TIME; } // 現在の時間を返す public long getNowTime(){ return mNowTime; } // カウントダウン開始 public void startCountDown(){ mStartTime = System.currentTimeMillis(); } // 現在の時間を計算 // カウント終了でtrueを返す public boolean calc(){ long current = System.currentTimeMillis(); long time_gone = (current - mStartTime) / 1000; if(time_gone >= 30){ mNowTime = 0; }else { mNowTime = GAME_TIME - time_gone; } if(mNowTime == 0) { return true; } return false; } }
startCountDown()
で開始時間をセットして毎フレームcalc()
で計算、getNowTime()
で値を取得して表示すればOK。
↓表示例(SurfaceViewを継承したクラスで実装)
private CalcTime mCalcTime = new CalcTime(); private Boolean mClicked = false; @Override public void run() { while (thread != null){ if(mClicked){ mCalcTime.calc(); } this.onDraw(getHolder()); } } private void onDraw(SurfaceHolder holder){ Canvas c = holder.lockCanvas(); if(c == null){ return; } // 1の位 int ones_time = (int)mCalcTime.getNowTime() % 10; // 10の位 int tens_time = (int)mCalcTime.getNowTime() / 10; c.drawText(tens_time,0,0,paint); c.drawText(ones_time,0,FONT_SIZE,paint); holder.unlockCanvasAndPost(c); } @Override public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == ACTION_DOWN){ mClicked = true; mCalcTime.startCountDown(); } return super.onTouchEvent(event); }