KeyEventでキー入力取得
そんなわけでアプリ作るのに必須のキー入力。
キーイベントを取得するにはonKeyDown()をオーバーライドすれば良い。
そのときのポイントが2つ。
- "setFocusable(true);"を忘れない
- "invalidate();"を忘れない
invalidate()が必要なのはループするためなので、
Handlerとか使ってループする場合は必要でないかも。
以下動作画面。と言っても動きがないのでなんともいえない。
http://gyazo.com/7e9c3b8853ce7dbbe571529cfa3a5392.png
11/14追記
結局Handlerを使ってループしても描画するならinvalidate()は必要だよね。
なのでポイントの2つ目は「今回のソースに限っては"invalidate();"を忘れない」とするのが妥当か。
package net.swelt.android.keyeventtest; import android.app.Activity; import android.os.Bundle; import android.content.Context; import android.content.Resources; import android.graphics.*; import android.view.View; import android.view.KeyEvent; import android.graphics.Canvas; import android.graphics.drawable.Drawable; public class KeyEventTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(new SampleView(this)); } private static class SampleView extends View { private final int MOVE_VALUE = 10; private final int AREA_WIDTH = 320; private final int AREA_HEIGHT = 200; private Paint mPaint = new Paint(); private Point mPos = new Point(); private Bitmap mBitmap; public SampleView(Context context) { super(context); setFocusable(true); mBitmap = loadImage(R.drawable.kirby, 64 , 64); } public Bitmap loadImage(int fileid, int width, int height) { Resources r = this.getContext().getResources(); Bitmap bitmap = Bitmap.createBitmap(width, height, true); Drawable drawable = r.getDrawable(fileid); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, width, height); drawable.draw(canvas); return bitmap; } @Override protected void onDraw(Canvas canvas) { Paint paint = mPaint; canvas.drawColor(Color.WHITE); canvas.drawBitmap(mBitmap, mPos.x, mPos.y, paint); invalidate(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_DPAD_DOWN: mPos.y += MOVE_VALUE; if( mPos.y + mBitmap.height() > AREA_HEIGHT ) mPos.y = AREA_HEIGHT - mBitmap.height(); return true; case KeyEvent.KEYCODE_DPAD_UP: mPos.y -= MOVE_VALUE; if( mPos.y < 0 ) mPos.y = 0; return true; case KeyEvent.KEYCODE_DPAD_LEFT: mPos.x -= MOVE_VALUE; if( mPos.x < 0 ) mPos.x = 0; return true; case KeyEvent.KEYCODE_DPAD_RIGHT: mPos.x += MOVE_VALUE; if( mPos.x + mBitmap.width() > AREA_WIDTH ) mPos.x = AREA_WIDTH - mBitmap.width(); return true; } return super.onKeyDown(keyCode, event); } } }