Skip to content

Instantly share code, notes, and snippets.

@sergei-lapin
Created September 2, 2021 11:58
Show Gist options
  • Select an option

  • Save sergei-lapin/d0b920dde4322560a73fa037a5e3ea7a to your computer and use it in GitHub Desktop.

Select an option

Save sergei-lapin/d0b920dde4322560a73fa037a5e3ea7a to your computer and use it in GitHub Desktop.
Simple drag gesture detector with API simillar to android.view.ScaleGestureDetector
class DragGestureDetector(private val onDragListener: OnDragListener) {
var posX = 0f
private set
var posY = 0f
private set
private var activePointerId = -1
fun onTouchEvent(event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
saveEventPosition(event, event.actionIndex)
activePointerId = event.getPointerId(0)
onDragListener.onDragBegin(this)
}
MotionEvent.ACTION_MOVE -> {
saveEventPosition(event, event.findPointerIndex(activePointerId))
onDragListener.onDrag(this)
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
activePointerId = -1
onDragListener.onDragEnd(this)
}
MotionEvent.ACTION_POINTER_UP -> {
val pointerIndex = event.actionIndex
event.getPointerId(pointerIndex).takeIf { it == activePointerId }?.run {
val newPointerIndex = if (pointerIndex == 0) 1 else 0
saveEventPosition(event, newPointerIndex)
activePointerId = event.getPointerId(newPointerIndex)
}
}
else -> return false
}
return true
}
private fun saveEventPosition(event: MotionEvent, pointerIndex: Int) {
posX = event.getX(pointerIndex)
posY = event.getY(pointerIndex)
}
interface OnDragListener {
fun onDragBegin(detector: DragGestureDetector): Boolean
fun onDrag(detector: DragGestureDetector)
fun onDragEnd(detector: DragGestureDetector)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment