在 Jetpack Compose 上检测滑动方向

Meh*_*ker 1 android android-jetpack-compose android-jetpack-compose-gesture

我正在尝试在 Compose 中检测滑动方向。我为此使用了可拖动修饰符。但可拖动只允许检测一个方向(垂直或水平)。我想检测所有方向(左、右、上、下)的滑动。谁能帮助我我该怎么做?谢谢!

Noa*_*oah 6

Modifier.dragGestureFilter检测任意方向的拖动。传递 的实例DragObserver并覆盖onDrag。在这里您可以根据 检测滑动方向Offset。该对象具有xy值,根据方向为正值或负值。

您的代码如下所示:

Box(
  Modifier.dragGestureFilter(
    dragObserver = object : DragObserver() {
      override fun onDrag(dragDistance: Offset): Offset {
        val (x, y) = dragDistance
        when {
          x > 0 -> { /* right */ }
          x < 0 -> { /* left */ }
        }
        when {
          y > 0 -> { /* down */ }
          y < 0 -> { /* up */ }
        }
      }
    }
  )
)
Run Code Online (Sandbox Code Playgroud)

要实际移动对象,您必须应用Modifier.offset在 中更新的值onDrag

  • 请注意,“Modifier.dragGestureFilter 已被弃用。请使用 Modifier.pointerInput { detectorDragGestures (...)} 代替。或者,使用 Modifier.draggable 进行单轴拖动”(https://developer.android.com/jetpack/androidx/发布/compose-foundation#1.0.0-alpha02) (5认同)

Gab*_*tti 5

有了1.0.0您可以使用pointerInput修改器控制与拖动手势detectDragGestures功能。

就像是:

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

    Box(
        Modifier
            .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
            .size(100.dp, 100.dp)
            .background(Color.Blue)
            .pointerInput(Unit) {
                detectDragGestures { change, dragAmount ->
                    change.consumeAllChanges()

                    val (x,y) = dragAmount
                    when {
                        x > 0 ->{ /* right */ }
                        x < 0 ->{ /* left */ }
                    }
                    when {
                        y > 0 -> { /* down */ }
                        y < 0 -> { /* up */ }
                    }

                    offsetX += dragAmount.x
                    offsetY += dragAmount.y
                }
            }
    )
}
Run Code Online (Sandbox Code Playgroud)