How to detect swipe in kotlin (Android)

In this post we gonna see the easiest way to handle event like left /right/top/bottom swipe for any view .

This class (OnSwipeTouchListener.kt) can be used for detection.

package np.com.barahasoft.ourbarahakshetra.common

import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import java.lang.Math.abs

internal open class OnSwipeTouchListener(c: Context?) :
        View.OnTouchListener {
    private val gestureDetector: GestureDetector
    override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
        return gestureDetector.onTouchEvent(motionEvent)
    }
    private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {
        private val SWIPE_THRESHOLD: Int = 100
        private val SWIPE_VELOCITY_THRESHOLD: Int = 100
        override fun onDown(e: MotionEvent): Boolean {
            return true
        }
        override fun onSingleTapUp(e: MotionEvent): Boolean {
            onClick()
            return super.onSingleTapUp(e)
        }
        override fun onDoubleTap(e: MotionEvent): Boolean {
            onDoubleClick()
            return super.onDoubleTap(e)
        }
        override fun onLongPress(e: MotionEvent) {
            onLongClick()
            super.onLongPress(e)
        }
        override fun onFling(
                e1: MotionEvent,
                e2: MotionEvent,
                velocityX: Float,
                velocityY: Float
        ): Boolean {
            try {
                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()
                        }
                    }
                }
                else {
                    if (abs(diffY) > SWIPE_THRESHOLD && abs(
                                    velocityY
                            ) > SWIPE_VELOCITY_THRESHOLD
                    ) {
                        if (diffY < 0) {
                            onSwipeUp()
                        }
                        else {
                            onSwipeDown()
                        }
                    }
                }
            } catch (exception: Exception) {
                exception.printStackTrace()
            }
            return false
        }
    }
    open fun onSwipeRight() {}
    open fun onSwipeLeft() {}
    open fun onSwipeUp() {}
    open fun onSwipeDown() {}
    private fun onClick() {}
    private fun onDoubleClick() {}
    private fun onLongClick() {}
    init {
        gestureDetector = GestureDetector(c, GestureListener())
    }
}

Now let’s see how we use above class

binding!!.wvDetails.setOnTouchListener(object : OnSwipeTouchListener(this@NewsDetailActivity) {
            override fun onSwipeLeft() {
                super.onSwipeLeft()
                Log.d(TAG, "onSwipeLeft: ")
                
            }
            override fun onSwipeRight() {
                super.onSwipeRight()
                Log.d(TAG, "onSwipeRight: ")
            }
            override fun onSwipeUp() {
                super.onSwipeUp()
                Log.d(TAG, "onSwipeUp: ")
            }
            override fun onSwipeDown() {
                super.onSwipeDown()
                Log.d(TAG, "onSwipeDown: ")
            }
        })