- 2013-01-20 (日) 14:37
- Android
ユーザによるタッチイベントが発生するとActivityクラスおよびViewクラスのonTouchEvent() が呼び出されます。
このメソッドをオーバーライドすることで、タッチイベント処理を実装することができます。
onTouchEventメソッド
onTouchEvent() は次のように定義されています。
public boolean onTouchEvent(MotionEvent event)
戻り値
boolean型 になっていますが、これはイベント処理が完了したかどうかを表すフラグになっています。
trueがイベント処理完了、falseがイベント未処理を表します。
さて、このフラグはどういった意味を持つものなのでしょうか?
レイアウトで複数のViewを重ねているような場合は上位Viewから下位Viewに順にタッチイベントが降りていき、最終的にActivityに通知されます。
その過程でイベント処理が完了した場合は、以降のViewおよびActivityへの通知は行われません。
つまり、戻り値としてtrueを返した場合はレイアウトの下位に存在するViewに対しての通知が中断されることになります。
オーバーライドして処理を記述しているのだから常にtrueを返せばいいのかというと、そういうわけではありません。
例えば、ScrollViewの上に何らかのViewが置かれているような場合を考えてみます。
View上でタッチイベントを実装してtrueを返すとScrollViewにイベント通知が行われず、結果としてスクロール処理が機能しなくなってしまいます。
そのため、このような場合はfalseを返すのが正解です。
MotionEvent
引数としてMotionEventオブジェクトが渡されます。
このオブジェクトにはタッチイベントの詳細情報が含まれているので、これらの情報を元に各種処理を行うことになります。
代表的な情報取得メソッドは次のとおりです。
| メソッド | 取得情報 |
|---|---|
| getAction | タッチイベントのアクション |
| getDownTime | 押されている時間[ms] |
| getEventTime | イベント発生時刻 |
| getSize | タッチされている画面領域サイズ |
| getX | タッチされたX座標位置 |
| getY | タッチされたY座標位置 |
アクション
getAction() は戻り値としてアクション種別を返します。
アクション種別として次のものが定義されています。
| 定数 | 説明 |
|---|---|
| ACTION_MOVE | 押したまま移動 |
| ACTION_UP | 押上 |
| ACTION_DOWN | 押下 |
| ACTION_CANCEL | タッチ操作キャンセル(UPとDOWNの同時発生) |
| ACTION_OUTSIDE | UI範囲外を押下 |
サンプルコード
public class MainActivity extends Activity {
...
@Override
public boolean onTouchEvent(MotionEvent event) {
//==== 座標取得 ====//
Log.d("onTouchEvent", "X:" + event.getX());
Log.d("onTouchEvent", "Y:" + event.getY());
//==== アクション判定 ====//
switch(event.getAction()) {
//== 押したまま移動 ==//
case MotionEvent.ACTION_MOVE:
Log.d("onTouchEvent", "ACTION_MOVE");
break;
//== 押上 ==//
case MotionEvent.ACTION_UP:
Log.d("onTouchEvent", "ACTION_UP");
break;
//== 押下 ==//
case MotionEvent.ACTION_DOWN:
Log.d("onTouchEvent", "ACTION_DOWN");
break;
//== キャンセル ==//
case MotionEvent.ACTION_CANCEL:
Log.d("onTouchEvent", "ACTION_CANCEL");
break;
//== UI範囲外を押下 ==//
case MotionEvent.ACTION_OUTSIDE:
Log.d("onTouchEvent", "ACTION_OUTSIDE");
break;
}
return super.onTouchEvent(event);
}
}
関連サイト
関連があると思われる記事:
- [WPF] 未処理例外をキャッチ
- [Android] TextViewでクリック処理
- [Android] Backボタンが押されたときの処理
- [Android] ImageViewのcontentDescription
- [C#] サービスのインストールとデバッグ
- Newer: [Android端末] Nexus7で画面キャプチャ
- Older: [Android] 現在日時の取得
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://gacken.com/wp/program/android/1259/trackback/
- Listed below are links to weblogs that reference
- [Android] タッチイベント処理 from ミライニトドケ