如何在Jetpack Compose中获取拖拽手势的起止位置?
Jetpack Compose获取拖拽起止位置的正确方式
你的代码问题所在:
detectDragGestures的onDrag回调仅在拖拽持续过程中触发,此时PointerInputChange的状态已经过了初始按下(down)和最终抬起(up)的阶段,所以你在onDrag里判断changedToDownIgnoreConsumed()和changedToUpIgnoreConsumed()永远不会成立。正确解法:
detectDragGestures本身就提供了专门的回调来处理拖拽的开始和结束,不需要在onDrag里硬凑逻辑。直接使用onDragStart和onDragEnd参数即可:
Box( modifier = Modifier .size(200.dp) .background(Color.Gray) .pointerInput(key1 = Unit) { detectDragGestures( onDragStart = { startPosition -> // 拖拽开始时的初始按下位置 Log.d("User Input", "Drag start @ $startPosition") }, onDrag = { change, dragAmount -> // 拖拽过程中的逻辑(比如更新组件位置) }, onDragEnd = { // 获取拖拽结束时的抬起位置 val upEvent = awaitPointerEvent(PointerEventPass.Main) val endPosition = upEvent.changes.firstOrNull()?.position Log.d("User Input", "Drag end @ $endPosition") }, onDragCancel = { // 拖拽被取消时的逻辑(比如拖到组件外抬起) } ) } )
补充说明
onDragStart的参数直接返回拖拽开始的按下位置,无需额外判断状态。onDragEnd本身没有直接传入抬起位置,需要通过awaitPointerEvent获取最后一次指针事件的坐标,以此拿到拖拽结束时的位置。- 如果不需要处理拖拽过程的逻辑,可以只实现
onDragStart和onDragEnd两个回调。
内容的提问来源于stack exchange,提问作者ORAS
相关产品推荐
相关产品推荐

