如何在Android Jetpack Compose中创建任意方向的拖动手势

如何在Android Jetpack Compose中创建任意方向的拖动手势,android,android-jetpack-compose,Android,Android Jetpack Compose,我想在@Composable中检测一个手势,它允许我在屏幕上的任何方向拖动一个元素 我尝试使用LongPressDragoServer,但在拖动一段时间后,它会捕捉到一个方向(水平或垂直),而另一个方向的偏移量根本不会改变(它将始终等于0) 我想要实现的功能示例: 长按晶圆厂,并拖动它在屏幕上,使其位置不断在用户的手指下 我正在使用Compose1.0.0-alpha04 仅向一个方向拖动的示例代码(感谢) 您可以将Modifier.pointerInput与detectdragpersitie

我想在@Composable中检测一个手势,它允许我在屏幕上的任何方向拖动一个元素


我尝试使用LongPressDragoServer,但在拖动一段时间后,它会捕捉到一个方向(水平或垂直),而另一个方向的偏移量根本不会改变(它将始终等于0)

我想要实现的功能示例:
长按晶圆厂,并拖动它在屏幕上,使其位置不断在用户的手指下

我正在使用Compose1.0.0-alpha04

仅向一个方向拖动的示例代码(感谢)


您可以将
Modifier.pointerInput
detectdragpersities
一起使用,以执行与您所需完全相同的操作

例如:

   @Composable
fun Drag2DGestures() {
    var size by remember { mutableStateOf(400.dp) }
    val offsetX = remember { mutableStateOf(0f) }
    val offsetY = remember { mutableStateOf(0f) }
    Box(modifier = Modifier.size(size)){
        Box(
                Modifier
                        .offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                        .background(Color.Blue)
                        .size(50.dp)
                        .pointerInput(Unit) {
                            detectDragGestures { change, dragAmount ->
                                change.consumeAllChanges()
                                offsetX.value = (offsetX.value + dragAmount.x)
                                        .coerceIn(0f, size.width.toFloat() - 50.dp.toPx())

                                offsetY.value = (offsetY.value + dragAmount.y)
                                        .coerceIn(0f, size.height.toFloat() - 50.dp.toPx())
                            }
                        }
        )
        Text("Drag the box around", Modifier.align(Alignment.Center))
    }
}
将产生以下结果:

ٍٍٍٍ为jank/drop-in帧感到抱歉,内置模拟器记录器无法顺利记录60fps


撰写版本:alpha-11

“我尝试使用LongPressDragoServer,但在拖动一段时间后,它会捕捉到一个方向(水平或垂直),而另一个方向的偏移量根本不会改变(它将始终等于0)”--没有人能帮助调试他们看不到的代码。A会增加有人可以帮助你的可能性。我不知道为什么这个问题已经结束了。Modifier.draggable()一次只能拖动一个方向。你不能有对角线拖拽,这就是OPasking@CommonsWare.dragGestureFilter(dragObserver=object:dragObserver{override fun onDrag(dragDistance:Offset):Offset{val newX=dragDistance.x+verticalOffset.value val newY=dragDistance.y+horizontalOffset.value verticalOffset.value=newX horizontalOffset.value=newY返回dragDistance}})检查
size
设置在何处?我看到它初始化为零,然后您使用它的
.width
.height
来约束拖动运动量。您可以在
指针输入之前使用类似于:
修饰符.onGloballyPositioned
调用并将
大小设置为
中给定的大小nGloballyPositioned
lambda(此处为50 dp)。仅供参考,如果您复制粘贴上面的代码,它将像一个符咒一样工作
   @Composable
fun Drag2DGestures() {
    var size by remember { mutableStateOf(400.dp) }
    val offsetX = remember { mutableStateOf(0f) }
    val offsetY = remember { mutableStateOf(0f) }
    Box(modifier = Modifier.size(size)){
        Box(
                Modifier
                        .offset { IntOffset(offsetX.value.roundToInt(), offsetY.value.roundToInt()) }
                        .background(Color.Blue)
                        .size(50.dp)
                        .pointerInput(Unit) {
                            detectDragGestures { change, dragAmount ->
                                change.consumeAllChanges()
                                offsetX.value = (offsetX.value + dragAmount.x)
                                        .coerceIn(0f, size.width.toFloat() - 50.dp.toPx())

                                offsetY.value = (offsetY.value + dragAmount.y)
                                        .coerceIn(0f, size.height.toFloat() - 50.dp.toPx())
                            }
                        }
        )
        Text("Drag the box around", Modifier.align(Alignment.Center))
    }
}