这两天用 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 -> }) }
本站由以下主机服务商提供服务支持:
0条评论