Merge "[multi-shade] Fix multi touch bug." into udc-dev
This commit is contained in:
@@ -182,6 +182,26 @@ constructor(
|
|||||||
interactionState = null
|
interactionState = null
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
MotionEvent.ACTION_POINTER_UP -> {
|
||||||
|
val removedPointerId = event.getPointerId(event.actionIndex)
|
||||||
|
if (removedPointerId == interactionState?.pointerId && event.pointerCount > 1) {
|
||||||
|
// We removed the original pointer but there must be another pointer because the
|
||||||
|
// gesture is still ongoing. Let's switch to that pointer.
|
||||||
|
interactionState =
|
||||||
|
event.firstUnremovedPointerId(removedPointerId)?.let { replacementPointerId
|
||||||
|
->
|
||||||
|
interactionState?.copy(
|
||||||
|
pointerId = replacementPointerId,
|
||||||
|
// We want to update the currentY of our state so that the
|
||||||
|
// transition to the next pointer doesn't report a big jump between
|
||||||
|
// the Y coordinate of the removed pointer and the Y coordinate of
|
||||||
|
// the replacement pointer.
|
||||||
|
currentY = event.getY(replacementPointerId),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
MotionEvent.ACTION_CANCEL -> {
|
MotionEvent.ACTION_CANCEL -> {
|
||||||
if (isDraggingShade()) {
|
if (isDraggingShade()) {
|
||||||
// Our drag gesture was canceled by the system. This happens primarily in one of
|
// Our drag gesture was canceled by the system. This happens primarily in one of
|
||||||
@@ -219,4 +239,17 @@ constructor(
|
|||||||
private fun isDraggingShade(): Boolean {
|
private fun isDraggingShade(): Boolean {
|
||||||
return interactionState?.isDraggingShade ?: false
|
return interactionState?.isDraggingShade ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the index of the first pointer that is not [removedPointerId] or `null`, if there is
|
||||||
|
* no other pointer.
|
||||||
|
*/
|
||||||
|
private fun MotionEvent.firstUnremovedPointerId(removedPointerId: Int): Int? {
|
||||||
|
return (0 until pointerCount)
|
||||||
|
.firstOrNull { pointerIndex ->
|
||||||
|
val pointerId = getPointerId(pointerIndex)
|
||||||
|
pointerId != removedPointerId
|
||||||
|
}
|
||||||
|
?.let { pointerIndex -> getPointerId(pointerIndex) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user