【问题标题】:How to detect up/down scroll for a Column with vertical scroll?如何检测垂直滚动列的上/下滚动?
【发布时间】:2021-08-16 14:54:28
【问题描述】:

我有一列有很多项目;基于滚动,我想显示/隐藏浮动操作按钮,如果滚动向下,隐藏它,如果滚动向上,显示它。

我的代码部分工作,但滚动有问题。下面是代码。需要帮助。

 Column(
      Modifier
        .background(color = colorResource(id = R.color.background_color))
        .fillMaxWidth(1f)
        .verticalScroll(scrollState)
        .scrollable(
          orientation = Orientation.Vertical,
          state = rememberScrollableState {
            offset.value = it

              coroutineScope.launch {
                scrollState.scrollBy(-it)
              }

            it
          },
        )
    ) { // 10-20 items }

基于偏移值(无论是正/负),我保持FAB的可见性。

【问题讨论】:

  • FloatingActionButton 在哪里?
  • 它在Scaffold,Column在Scaffold的内容下
  • lazyColumn 是一个选项而不是一个可滚动的列吗?
  • Lazy column 存在从网络加载图像的问题,我上次尝试过,这就是我现在使用 Column 的原因。无论如何,我只需要知道,如何检测上/下滚动?

标签: android scroll android-jetpack android-jetpack-compose vertical-scrolling


【解决方案1】:

您可以使用nestedScroll 修饰符。

类似:

val fabHeight = 72.dp //FabSize+Padding
val fabHeightPx = with(LocalDensity.current) { fabHeight.roundToPx().toFloat() }
val fabOffsetHeightPx = remember { mutableStateOf(0f) }

val nestedScrollConnection = remember {
    object : NestedScrollConnection {
        override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {

            val delta = available.y
            val newOffset = fabOffsetHeightPx.value + delta
            fabOffsetHeightPx.value = newOffset.coerceIn(-fabHeightPx, 0f)

            return Offset.Zero
        }
    }
}

由于可组合支持嵌套滚动,只需将其应用于Scaffold

Scaffold(
        Modifier.nestedScroll(nestedScrollConnection),
        scaffoldState = scaffoldState,
        //..

        floatingActionButton = {
            FloatingActionButton(
                modifier = Modifier
                    .offset { IntOffset(x = 0, y = -fabOffsetHeightPx.value.roundToInt()) },
                onClick = {}
            ) {
                Icon(Icons.Filled.Add,"")
            }
        },
        content = { innerPadding ->
            Column(
                Modifier
                    .fillMaxWidth(1f)
                    .verticalScroll(rememberScrollState())
            ) {
                //....your code
            }
        }
 )

它可以与ColumnverticalScroll 一起使用,也可以与LazyColumn 一起使用。

【讨论】:

  • 我面临的唯一问题是,当滚动到最底部的项目时,滚动会自动向上跳跃一点......它只会在最底部的项目中发生。
  • 有没有办法让“缩小和增长”偏移,而不是浮动操作按钮的“向上滑动和向下滑动”?
猜你喜欢
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2021-11-13
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多