2007年12月13日

Android覚え書き・キーイベントとマウスイベントの取得

前回のコードは動画と「再生」「停止」ボタンが重なってしまっているのがイマイチだった。携帯端末の場合はハードキーに機能を割り当てるのが普通だと思うので、SurfaceViewを拡張したクラスを作ってみた。

public class MovieView extends SurfaceView {
	private MediaPlayer mMediaPlayer;

	MovieView(Context context) {
		super(context);

		setFocusable(true);

		mMediaPlayer = new MediaPlayer();
		Surface sPlay = getHolder().getSurface();
		mMediaPlayer.setDisplay(sPlay);

		mMediaPlayer
				.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
					public void onCompletion(MediaPlayer mp) {
						mp.reset();
					}
				});
	}
	public void setDataSource(String path) {
		try {
			mMediaPlayer.setDataSource(path);
		} catch (IOException e) {
			Log.e("", e.getMessage());
		}

	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		int currPos = mMediaPlayer.getCurrentPosition();
		if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
			if (currPos <= 0) {
				mMediaPlayer.prepare();
				mMediaPlayer.start();
			} else {
				mMediaPlayer.stop();
				mMediaPlayer.reset();
			}
		}
		return true;
	}

	@Override
	public boolean onMotionEvent(MotionEvent event) {
		int currPos = mMediaPlayer.getCurrentPosition();
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			if (currPos <= 0) {
				mMediaPlayer.prepare();
				mMediaPlayer.start();
			} else {
				mMediaPlayer.stop();
				mMediaPlayer.reset();
			}
		}
		return true;
	}
}

デフォルトの状態だと、キーイベントはActivityのOnKeyDown()やOnKeyUp()、マウスイベントはView.OnMotionEvent()で取得する。フルスクリーンで動画を再生する場合はキーイベントもViewで取ることにしたほうが分かりやすくなるので、そうしてみた。setFocusable(true)でフォーカスを取れるようにすればキーイベントも取れるようになる。上の例では、四つの方向キーの真ん中にあるキーの押下、またはマウスクリックで再生したり停止したりできるようにした。

OnMotionEvent()で取れるマウスイベントはUP, DOWN, MOVE, CANCEL。iPhoneのマルチタッチはAndroidでは実現できないようだ。ダブルクリックも自前で実装しなきゃいけないらしい

画面のレイアウトを定義するXMLファイルで拡張したクラスを使う方法はBuilding Custom Componentsというページに解説されているが、まだうまくいっていない。


kazhik at 20:06│Comments(0)TrackBack(0)Android 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔