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というページに解説されているが、まだうまくいっていない。