Androidのタップ処理と長押しについて

KotlinでAndriodのタップ処理と長押しの処理を記述していきます。

tap処理

まずAndriodに触るのが久々すぎてiosのTouchesBeganのような処理をAndriodで書くにはどうしたら良いのか完全に忘れてしまったので、調べてみました。

    @Override
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        event ?: false
        when (event!!.action) {
            // タップされた時
            MotionEvent.ACTION_DOWN -> {
                Log.d("tap", "touchesBegan")
             }
            // タップ終了時
            MotionEvent.ACTION_UP -> {
                Log.d("tap", "touchesEndet")
            // タップ後に動いた時
            MotionEvent.ACTION_MOVE -> {
                Log.d("tap", "touchedMoved")
            }
        }
        return false;
    }

onTouchEventの引数でfalseを返していますが、ここでfalseを返すと一番最初のeventのみを取得することになるので1本しかeventを取得しません。

trueで返した場合マルチタップの取得が可能になります。

長押しについて

Andriodで一定時間後に処理を行うにはHandlerとRunnableを使用するのが良いようです。

tap処理のコードにHandlerとRunnableを追加してあげると1秒後にログが出力されるようになりました!

コード

    val longPressHandler = Handler()
    val longPressReceiver = Runnable {
        Log.d("tap", "長押しされたよ")
    }  

    @Override
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        event ?: false
        when (event!!.action) {
            // タップされた時
            MotionEvent.ACTION_DOWN -> {
                longPressHandler.postDelayed( longPressReceiver, 1000)
             }
            // タップ終了時
            MotionEvent.ACTION_UP -> {
                //ここで解除すれば1秒に満たない場合長押し失敗させることができる
                longPressHandler.removeCallbacks( longPressReceiver )
            }
        }
        return false;
    }

参考文献

In onTouchEvent, ACTION_UP doesn’t work

View#onTouchEvent を実装したが最初のタッチのイベントしか来ない

Splash画面でpostDelayedして一定時間画面を表示する

Swift

前の記事

リスコフの置換原則(LSP)
Swift

次の記事

チェンネル入れ替え