くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

ViewGroup で ダブルタップを検知するには

導入

ViewGroup 全体でダブルタップを検知したいときありますよね?そんな時の解決方法です。

前提条件

  • Android アプリ
  • ViewGroup 内でダブルタップされたら検知したい

提案手法

対象となるViewGroup に GestureDelector をセットして監視する。

手順

  1. 検知したい ViewGroupclickable, focusable の属性を付与する。
  2. GestureDetectorインスタンスを作成し、SimpleOnGestureListener を実装したクラスをインスタンス作成時に渡す。
  3. 上記、インターフェイスを実装したクラスにonDoubleTap のメソッドを override して任意の処理を追加する。
  4. ViewGroup の setOnTouchListener において引数で渡ってくる MotionEvent を 2. にて作成した インスタンスonTouchEvent メソッドに渡して実行する

再現コード

対象となる ViewGroup については container という名前とする。

        val detector = GestureDetector(
            applicationContext,
            object : GestureDetector.SimpleOnGestureListener() {
                override fun onDoubleTap(e: MotionEvent?): Boolean {
                    Toast.makeText(
                        applicationContext,
                        "ダブルタップされたよ😂",
                        Toast.LENGTH_SHORT
                    ).show()
                    return super.onDoubleTap(e)
                }
            })

        container.setOnTouchListener { _, event ->
            detector.onTouchEvent(event)
        }