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: ") } })