在可滚动控件内拖动手势

时间:2021-05-25 17:03:50

标签: kotlin android-jetpack-compose

我已经基于 Canvas 制作了一个自定义控件。它使用两个 .pointerInput 修饰符,一个用于检测点击,一个用于检测拖动,因此用户可以切换一列 50 个按钮,方法是一次单击一个按钮或拖动多个按钮以将它们全部设置为一次。它运行良好,现在我想要一个包含许多这些的水平滚动行。直接的问题是,当应用 .horizontalScroll 修饰符时,Row 也会吞下垂直移动,甚至点击,所以虽然我可以滚动浏览许多控件,但我不再能够与它们进行交互。

我能找到的唯一类似的例子是 Gestures 文档中的嵌套滚动,但这是在使用滚动的两个控件之间,虽然外部控件显然没有阻止内部控件接收事件,但不清楚如何在我的情况下应用它。

没有粘贴大量代码,我定义了行

@Composable
fun ScrollBoxes() {
    Row(
        modifier = Modifier
            .background(Color.LightGray)
            .fillMaxSize()
            .horizontalScroll(rememberScrollState())
    ) {
        repeat(20) {
            Column {
                Text(
                    "Item $it", modifier = Modifier
                        .padding(2.dp)
                        .width(500.dp)
                )
                JetwashSlide(
                    model = JetwashSlideViewModel()
                )
            }
            
        }
    }
}

而Canvas的修饰符是我的自定义控件设置为

modifier
        .pointerInput(Unit) {
            detectDragGestures(
                onDragStart = { ... }

                },
                onDragEnd = { ... },
                onDrag = { change, dragAmount ->
                    change.consumeAllChanges();
                    ...
                    }
                }
            )
        }
        .pointerInput(Unit) {
            detectTapGestures(
                onPress = { it ->
                    ...
                }
            )
        }

一种粗略的方法是使用可滚动的标签行并使用当前选择的标签来确定当前可见的全宽自定义控件。这不会像让控件水平滚动那样美观。有没有人知道如何实现这一目标?

0 个答案:

没有答案