Created
September 2, 2021 11:58
-
-
Save sergei-lapin/d0b920dde4322560a73fa037a5e3ea7a to your computer and use it in GitHub Desktop.
Simple drag gesture detector with API simillar to android.view.ScaleGestureDetector
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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