You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:29:50