我有一个使用 detectorDragGestures 函数的可拖动项目。但是,我注意到,当用户按下屏幕并进行快速移动时,原始指针移动和屏幕上拖动项目的相应移动之间存在明显的延迟。
这是我从官方文档中摘取的代码片段:
@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
}
}
)
}
}
我希望拖动的项目能够跟随指针位置而没有任何延迟。
我可以对代码进行哪些调整来实现更直接的拖动行为?
如有任何建议,我们将不胜感激!
代码看起来不错,当我尝试它时,观察到的延迟要低得多。
也就是说,您可以尝试以下操作:
draggable2D
修饰符(1.6.0-rc01 是撰写本文时可用的最新版本)。使用以下命令代替 pointerInput
修饰符:.draggable2D(rememberDraggable2DState {
offsetX += it.x
offsetY += it.y
})
onDrag
闭包的变化有一个值position
,可以更准确地用作视图位置。
.pointerInput(Unit) {
detectDragGestures(
onDragStart = { unit ->
startDrag = unit.y
},
onDrag = { change, _ ->
view.draggedDelta = with(density) { change.position.y - startDrag }.toDp()
change.consume()
}
与像您的示例一样附加偏移状态相比,我更喜欢这样做,并且在我的情况下没有延迟。