如何在 Android JetPack Compose 中使拖动的项目跟随指针位置而无延迟?

问题描述 投票:0回答:2

我有一个使用 detectorDragGestures 函数的可拖动项目。但是,我注意到,当用户按下屏幕并进行快速移动时,原始指针移动和屏幕上拖动项目的相应移动之间存在明显的延迟。

Dragging with latency

这是我从官方文档中摘取的代码片段:

@Composable
fun DraggableTextLowLevel() {
    Box(modifier = Modifier.fillMaxSize()) {
        var offsetX by remember { mutableStateOf(0f) }
        var offsetY by remember { mutableStateOf(0f) }

        Box(
            Modifier
                .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
                .background(Color.Blue)
                .size(50.dp)
                .pointerInput(Unit) {
                    detectDragGestures { change, dragAmount ->
                        change.consume()
                        offsetX += dragAmount.x
                        offsetY += dragAmount.y
                    }
                }
        )
    }
}

我希望拖动的项目能够跟随指针位置而没有任何延迟。

我可以对代码进行哪些调整来实现更直接的拖动行为?

如有任何建议,我们将不胜感激!

android android-jetpack-compose drag
2个回答
0
投票

代码看起来不错,当我尝试它时,观察到的延迟要低得多。

也就是说,您可以尝试以下操作:

  • 部署到硬件设备而不是模拟器。
  • 确保您部署了发布版本,而不是调试版本。
  • 尝试自 compose 1.6.0-alpha08 以来可用的
    draggable2D
    修饰符(1.6.0-rc01 是撰写本文时可用的最新版本)。使用以下命令代替
    pointerInput
    修饰符:
.draggable2D(rememberDraggable2DState {
    offsetX += it.x
    offsetY += it.y
})

0
投票

onDrag
闭包的变化有一个值
position
,可以更准确地用作视图位置。

.pointerInput(Unit) {
    detectDragGestures(
        onDragStart = { unit ->
            startDrag = unit.y
        },
        onDrag = { change, _ ->
            view.draggedDelta = with(density) { change.position.y - startDrag }.toDp() 
            change.consume()
        }

与像您的示例一样附加偏移状态相比,我更喜欢这样做,并且在我的情况下没有延迟。

© www.soinside.com 2019 - 2024. All rights reserved.