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