msty開発メモ

技術ネタを綴ります

【Androidプログラミング】タッチ処理でACTION_DOWNしか発生しない時の解決方法

意外とハマる人が多そうな気もするのでメモ書き。

Android Studioで開発していると、インテリセンス機能を使ってメソッドを挿入することが多いと思う。

例えばタッチイベントを処理するメソッド"onTouchEvent"を挿入するとこんな感じのソースが挿入される

@Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

実はこれが罠なのだ。

Activityクラスを継承したクラスに汚く直接書けば正しく動作するが、
独自に作成したViewクラスを継承したクラスからだと、親クラスのタッチイベントからfalseが帰ってくる。
タッチ中、またがタッチ終了時にもこのメソッドを呼ぶには、このメソッドがtrueを返す必要がある。


つまり戻り値をtrueにすれば解決。
以下のソースで動作確認してみてください

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            //タップした瞬間
            Log.d("LOG","Down");
            //ここでfalseを返すと以降のタッチイベントは処理されない
            //return false;
            break;
        case MotionEvent.ACTION_MOVE:
            //タップし続けて座標が変化している間
            Log.d("LOG","Move");
            break;
        case MotionEvent.ACTION_UP:
            //タップしていた指が話された瞬間
            Log.d("LOG","Up");
            break;
    }

    return true;
}

ACTION_MOVEなるとfalseにしてもタッチイベントを取得するのでそちらは工夫が必要。