import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import androidx.core.view.GestureDetectorCompat
import kotlin.math.abs
class SwipeListener(context: Context, private val onSwipe: (SwipeDirection) -> Unit) : View.OnTouchListener {
private val gestureDetector: GestureDetectorCompat
init {
gestureDetector = GestureDetectorCompat(context, GestureListener())
}
override fun onTouch(view: View?, event: MotionEvent?): Boolean {
return gestureDetector.onTouchEvent(event)
}
private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {
private val SWIPE_THRESHOLD = 100
private val SWIPE_VELOCITY_THRESHOLD = 100
override fun onFling(
e1: MotionEvent?,
e2: MotionEvent?,
velocityX: Float,
velocityY: Float
): Boolean {
val distanceX = e2?.x?.minus(e1?.x ?: 0f) ?: 0f
val distanceY = e2?.y?.minus(e1?.y ?: 0f) ?: 0f
if (abs(distanceX) > abs(distanceY) &&
abs(distanceX) > SWIPE_THRESHOLD &&
abs(velocityX) > SWIPE_VELOCITY_THRESHOLD
) {
onSwipe.invoke(if (distanceX > 0) SwipeDirection.RIGHT else SwipeDirection.LEFT)
return true
} else if (abs(distanceY) > SWIPE_THRESHOLD &&
abs(velocityY) > SWIPE_VELOCITY_THRESHOLD
) {
onSwipe.invoke(if (distanceY > 0) SwipeDirection.DOWN else SwipeDirection.UP)
return true
}
return false
}
}
}
enum class SwipeDirection {
UP, DOWN, LEFT, RIGHT
}