这两天用 compose 写了一个九宫格,里面用了一个 detectDragGestures ,有很多回调,但唯独没有 onTap,以至于我点击时收不到回调无法做绘制,于是点进去看了下源码,挺好理解的,也很好改,copy 出来加两行代码就好了。
suspend fun PointerInputScope.detectTapDragGestures(
onDown: (Offset) -> Unit = { },
onDragStart: (Offset) -> Unit = { },
onDragEnd: () -> Unit = { },
onDragCancel: () -> Unit = { },
onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit
) {
forEachGesture {
awaitPointerEventScope {
val down = awaitFirstDown(requireUnconsumed = false)
var drag: PointerInputChange?
var overSlop = Offset.Zero
onDown.invoke(down.position)
do {
drag = awaitTouchSlopOrCancellation(down.id) { change, over ->
change.consumePositionChange()
overSlop = over
}
} while (drag != null && !drag.positionChangeConsumed())
if (drag != null) {
onDragStart.invoke(drag.position)
onDrag(drag, overSlop)
if (
!drag(drag.id) {
onDrag(it, it.positionChange())
it.consumePositionChange()
}
) {
onDragCancel()
} else {
onDragEnd()
}
}
}
}
}红字部分是我加的,其他都是 detectDragGestures 源码,kotlin 的代码,应该挺好理解的,以上。
后续:直接使用 onDragStart 即可。
再后续:直接组合即可:
modifier = Modifier.pointerInput(Unit) {
detectTapGestures(
onTap = {
}
)
}
.pointerInput(Unit) {
detectDragGestures(onDragStart = {
}, onDrag = { change, dragAmount ->
})
} 本站广告由 Google AdSense 提供
0条评论