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