package jp.android.Game20111028; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; public class Game20111028Activity extends Activity { /** * Activity が生成された際に呼び出される * * @param savedInstanceState 前回実行時の状態が保存されている。もしくは null */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
package jp.android.Game20111028; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Game20111028Activity extends Activity { /** * Activity が生成された際に呼び出される * * @param savedInstanceState 前回実行時の状態が保存されている。もしくは null */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView display = new TextView(this); display.setText("Hello World!!"); setContentView(display); } }
package jp.android.Game20111028; import android.content.Context; import android.graphics.Canvas; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.util.Log; import android.graphics.Paint; class GameView extends SurfaceView implements SurfaceHolder.Callback,Runnable { boolean bActive; boolean bLeft; boolean bRight; Thread mThread = null; SurfaceHolder mSurfaceHolder = null; Paint mPaint = null; int mInt = 0; // // Thread を走らせるための run メソッド // @Override public void run(){ Log.w(this.getClass().getName(), "Thread started"); while(bActive){ Canvas c = null; try { c = mSurfaceHolder.lockCanvas(null); if (c != null){ synchronized (mSurfaceHolder) { doDraw(c); } } } finally { // サーフェイスをロックした後、何らかの理由で例外が発生したとき、 // サーフェイスがアンロックされない事態をさけるため、finally にて、 // アンロックする。 if (c != null) { mSurfaceHolder.unlockCanvasAndPost(c); } } Thread.yield(); } } @Override public void draw(Canvas c){ doDraw(c); } // // 画面の再描画 // public void doDraw(Canvas c){ // 塗りつぶし mPaint.setARGB(255, 0, 0, 255); c.drawRect(0,0,c.getWidth(),c.getHeight(),mPaint); // 文字描画 mPaint.setARGB(255, 255, 255, 255); c.drawText("Goodbye World! "+String.format("%08x", mInt), 10, 10, mPaint); ++mInt; } // // キーが押された // @Override public boolean onKeyDown(int keyCode, KeyEvent msg) { if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT){ bLeft = true; return true; } if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){ bRight = true; return true; } return false; } // // キーが離された // @Override public boolean onKeyUp(int keyCode, KeyEvent msg) { if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT){ bLeft = false; return true; } if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){ bRight = false; return true; } return false; } // // コンストラクタ // // public GameView(Context context, AttributeSet attrs) { // super(context, attrs); public GameView(Context context) { super(context); mPaint = new Paint(); // サーフェイスに対する変更を受け取るため、holder にコールバックを設定する SurfaceHolder holder = getHolder(); holder.addCallback(this); mSurfaceHolder = holder; bActive = true; bLeft = false; bRight = false; mThread = new Thread(this); // ここでは開始しない } // // ウィンドウがフォーカスを得た/失った @Override public void onWindowFocusChanged(boolean hasWindowFocus) { } // // Surface の大きさが変わった際に呼び出される @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } // サーフェイスの生成が完了した際コールバックされる @Override public void surfaceCreated(SurfaceHolder holder) { // コンストラクタで生成した Thread をここで開始 bActive = true; mThread.start(); setFocusable(true); // make sure we get key events } // // Surface が破棄され、使用不能になると呼び出される // @Override public void surfaceDestroyed(SurfaceHolder holder) { // 操作不能にし、Thread を終了させる bActive = false; } }
package jp.android.Game20111028; import android.app.Activity; import android.os.Bundle; import jp.android.Game20111028.GameView; import jp.android.Game20111028.R; public class Game20111028Activity extends Activity { GameView mView = null; /** * Activity が生成された際に呼び出される * * @param savedInstanceState 前回実行時の状態が保存されている。もしくは null */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mView = new GameView(this); setContentView(mView); } }