Travis Griggs
05/23/2024, 8:00 PMTravis Griggs
05/23/2024, 8:01 PM@OptIn(ExperimentalComposeUiApi::class)
fun Modifier.maskPointerBy(predicate: (Offset, Size) -> Boolean, onTap: () -> Unit = {}): Modifier = composed(inspectorInfo = debugInspectorInfo {
name = "maskPointerBy"
properties["predicate"] = predicate
properties["onTap"] = onTap
}) {
var downAt: Offset? = remember { null }
val threshold = with(LocalDensity.current) { 20.dp.toPx() }
val view = LocalView.current
pointerInteropFilter { event ->
val eatEvent = predicate(Offset(event.x, event.y), Size(view.width.toFloat(), view.height.toFloat()))
if (eatEvent) {
when (event.action) {
ACTION_DOWN -> downAt = Offset(event.x, event.y)
ACTION_UP -> {
downAt?.let { downAt ->
val distance = ((downAt.x - event.x).pow(2) + (downAt.y - event.y).pow(2)).pow(0.5f)
if (distance <= threshold) {
onTap()
}
}
downAt = null
}
}
}
eatEvent
}
}
Travis Griggs
05/23/2024, 8:01 PM