Home > Android > [Android] タッチイベント処理

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

 

関連サイト

Developers:MotionEvent

 
 

関連があると思われる記事:

このエントリーをはてなブックマークに追加
はてなブックマーク - [Android] タッチイベント処理
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`tweetmeme` not found]
[`grow` not found]

Comments:0

Comment Form
Remember personal info

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 ミライニトドケ

Home > Android > [Android] タッチイベント処理

Search
Feeds
Meta
人気の記事

Return to page top