I made a `PointerInputScope.detectTripleTap` exten...
# compose
t
I made a
PointerInputScope.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.
Copy code
suspend 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") }
       })
}
(helper functions UnaryAction, NOT, consume, isConsumed, radius, and logged available on request if not obvious)