Androidアプリ開発(Kotlin + Layout XML)でジェスチャーを処理する方法

この記事は公開から1年以上経過しています。

Androidアプリ開発(Kotlin + Layout Xml)でタップ、ダブルタップ、上下左右へのスワイプジェスチャーを実装するサンプル。

あくまで最低限なので、必要に応じて手を加えてください。


サンプルソースコード(Kotlin)

class MainActivity : AppCompatActivity() {

    private lateinit var gesture: GestureDetectorCompat

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        gesture = GestureDetectorCompat(this, object : GestureDetector.SimpleOnGestureListener() {

            private val SWIPE_THRESHOLD = 100
            private val SWIPE_VELOCITY_THRESHOLD = 100

            override fun onDoubleTap(e: MotionEvent): Boolean {
                Log.d("TAG", "Double tap")
                return true
            }

            override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
                Log.d("TAG", "Single tap")
                return true
            }

            override fun onFling(
                e1: MotionEvent,
                e2: MotionEvent,
                velocityX: Float,
                velocityY: Float
            ): Boolean {
                var result = false

                val diffY = e2.y - e1.y
                val diffX = e2.x - e1.x
                if (abs(diffX) > abs(diffY)) {
                    if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight()
                        } else {
                            onSwipeLeft()
                        }
                        result = true
                    }
                } else {
                    if (abs(diffY) > SWIPE_THRESHOLD && abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeDown()
                        } else {
                            onSwipeUp()
                        }
                        result = true
                    }
                }

                return result
            }

            fun onSwipeRight() {
                Log.d("TAG", "Swipe right")
            }

            fun onSwipeLeft() {
                Log.d("TAG", "Swipe left")
            }

            fun onSwipeUp() {
                Log.d("TAG", "Swipe up")
            }

            fun onSwipeDown() {
                Log.d("TAG", "Swipe down")
            }
        })
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        if (event != null) {
            gesture.onTouchEvent(event)
        }
        return super.onTouchEvent(event)
    }
}


以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする