キーイベントの取得

今回は、キーイベントを取得して処理するというのを
実装してみます。
本当は、タッチイベントで画面をスライドさせたらっていう
処理がしたかったんですが
とりあえず、キーイベントから勉強の意味もかねて。

まず、メインですが今後タッチイベントなども勉強することを
考えて、ListViewでそれぞれ呼びやすくしておきます。

public class Practice extends Activity implements AdapterView.OnItemClickListener{
	
	private static final String[] MENU= {
		"TuchSample","KeyEventSample","WebKitSample"
	};
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
               android.R.layout.simple_list_item_1, MENU);
        ListView listView = (ListView) findViewById(android.R.id.list);
        
        listView.setAdapter(adapter);
        
        listView.setClickable(true);
        listView.setFocusable(true);
        listView.setOnItemClickListener(this);
    }

    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
       	switch(position) {
    		case 0:
    			break;			
    		case 1:
    			Intent intent = new Intent(this,net.kronosjp.sample.android.keyevent.KeyEventAct.class);
    			startActivityForResult(intent, RESULT_OK);
    			break;
    		default:
    			break;
    	}
    }
}

まあ、これは説明不用ですね。
今はキーイベントが選択された部分だけ実装してます。

次に、実際のキーイベントを取得する画面です。

画像はicon.pngですw

今回は、構成として上記画面表示および、イベント取得として、
Viewを継承したKeyEventViewクラスを作成します。
さらに、KeyEventViewには、View.OnKeyListenerをimplementsしておきます。
とりあえず、Toastを表示して確認するまでの実装です。

public class KeyEventView extends View implements View.OnKeyListener{

	private int w;
	private int h;
	private int x;
	private int y;
	private Bitmap bm;
	private final Paint paint = new Paint();
	
	public KeyEventView(Context context) {
		super(context);
		setFocusable(true);
		setOnKeyListener(this);
		Drawable drw = context.getResources().getDrawable(R.drawable.icon);
		w = drw.getIntrinsicWidth();
		h = drw.getIntrinsicHeight();
		
		bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
		Canvas cv = new Canvas(bm);
		
		drw.setBounds(0, 0, w, h);
		drw.draw(cv);
		
	}
	
	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		w = w/2;
		h = h/2;
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawColor(color.background_dark);
		canvas.drawBitmap(bm, x, y,paint);
	}
	
	public boolean onKey(View v, int keyCode, KeyEvent event) {
		int action = event.getAction();
		switch(action) {
		case KeyEvent.ACTION_UP:
			Toast.makeText(getContext(), "ActionUp", Toast.LENGTH_SHORT).show();
			break;
		case KeyEvent.ACTION_DOWN:
			Toast.makeText(getContext(), "ActionDown", Toast.LENGTH_SHORT).show();
			break;
		case KeyEvent.ACTION_MULTIPLE:
			Toast.makeText(getContext(), "ActionMultiple", Toast.LENGTH_SHORT).show();
			break;
		default:
			break;
		}
		return false;
	}

}

さて説明ですが、コンストラクタでicon.pngの描画してます。
このクラスでのポイントは、onKeyメソッドを使ってることです。
Viewを継承した段階で、onKeyUpメソッドやonKeyDownメソッドをオーバーライドして使えます。
しかし、処理をまとめる意味でonKeyメソッドを使用してみました。
KeyEventクラスにはキーイベント処理判別定数があるんで問題なしでした。

まあ、これでとりあえずは動いたんですが
判別って、上下しかないわけ?
右とか左とか押したら、下判別されたり上判別されたりと色々なわけです(汗

画像を右へ移動とかいう場合はどうするんだろ・・・

もう少し凝った実装して、色々弄ってみるか。
あっ、でも明日はタッチイベントの実装にしよう。