Travis Griggs
01/23/2024, 5:01 PMPointerInputScope.detectTripleTap
extension. Would love any feedback on whether I'm at all in the right direction. It seems to work... at least, in isolation. Code in thread.Travis Griggs
01/23/2024, 5:02 PMsuspend fun PointerInputScope.detectTripleTap(tolerance: Dp = 20.dp, onTripleTap: UnaryAction<Offset> = { _ -> }) {
val tolerancePixels = tolerance.toPx()
awaitEachGesture {
val firstTap = awaitFirstDown()
val startPoint = firstTap.position
var canceled = false
var taps = 0
withTimeout(viewConfiguration.doubleTapTimeoutMillis * 2) {
do {
val event = awaitPointerEvent()
canceled = canceled || event.isConsumed
if (NOT(canceled)) {
when (event.type) {
PointerEventType.Release -> {
taps += 1
val endPoint = event.changes.first { change -> change.changedToUpIgnoreConsumed() }
val noise = (endPoint.position - startPoint).radius
if (noise > tolerancePixels) {
noise.logged("$taps TOO NOISY")
canceled = true
}
else if (taps == 3) {
event.consume()
}
}
}
}
} while (NOT(canceled) && taps < 3)
if (NOT(canceled)) {
onTripleTap(startPoint)
}
}
}
}
@Preview(showBackground = true)
@Composable
private fun TripleTapPreview() {
Spacer(modifier = Modifier
.fillMaxSize()
.pointerInput(Unit) {
detectTripleTap { offset -> offset.logged("TRIPLE TAP") }
})
}
Travis Griggs
01/23/2024, 5:03 PM