首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetpack Compose Scrollbar

Jetpack Compose Scrollbar
EN

Stack Overflow用户
提问于 2021-02-24 06:08:12
回答 3查看 2.8K关注 0票数 16

有没有办法添加滚动条来添加LazyColumn (ScrollableColumn已被弃用)。Javadoc在Jetpack Compose中没有提到任何关于Scrollbar的内容。

为了澄清,这是我想要实现的设计:

有没有可能在Jetpack Compose中这样做呢?或者没有对Scrollbar的支持?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-20 22:01:23

这实际上是可能的(他们已经在LazyListState中添加了更多的东西),而且很容易做到。这是一个非常原始的滚动条(总是可见/不能拖动/等等),它使用项目索引来确定拇指的位置,所以在只有几个项目的列表中滚动时可能看起来不太好:

代码语言:javascript
复制
  @Composable
  fun Modifier.simpleVerticalScrollbar(
    state: LazyListState,
    width: Dp = 8.dp
  ): Modifier {
    val targetAlpha = if (state.isScrollInProgress) 1f else 0f
    val duration = if (state.isScrollInProgress) 150 else 500

    val alpha by animateFloatAsState(
      targetValue = targetAlpha,
      animationSpec = tween(durationMillis = duration)
    )

    return drawWithContent {
      drawContent()

      val firstVisibleElementIndex = state.layoutInfo.visibleItemsInfo.firstOrNull()?.index
      val needDrawScrollbar = state.isScrollInProgress || alpha > 0.0f

      // Draw scrollbar if scrolling or if the animation is still running and lazy column has content
      if (needDrawScrollbar && firstVisibleElementIndex != null) {
        val elementHeight = this.size.height / state.layoutInfo.totalItemsCount
        val scrollbarOffsetY = firstVisibleElementIndex * elementHeight
        val scrollbarHeight = state.layoutInfo.visibleItemsInfo.size * elementHeight

        drawRect(
          color = Color.Red,
          topLeft = Offset(this.size.width - width.toPx(), scrollbarOffsetY),
          size = Size(width.toPx(), scrollbarHeight),
          alpha = alpha
        )
      }
    }
  }

更新:我已经更新了代码。我已经知道如何在滚动或不滚动LazyColumn时显示/隐藏滚动条,并添加淡入/淡出动画。我还将drawBehind()更改为drawWithContent(),因为前者在内容后面绘制,所以在某些情况下,它可能会绘制在滚动条的顶部,这很可能不是我们所希望的。

票数 15
EN

Stack Overflow用户

发布于 2021-02-25 02:02:32

这在LazyColumn/LazyRow中是不可能的。

它计划在某个时候添加,但还没有具体的计划发布。我会在可能的时候更新这个答案。

票数 13
EN

Stack Overflow用户

发布于 2021-10-27 10:59:06

这可能会有帮助:https://github.com/sahruday/Carousel是一种类似于Compose as Composable function的方法。

可以与CarouselScrollState (在ScrollState上添加的参数)和LazyList一起使用。

如果高度是变化的或混合项目,我不建议添加滚动指示器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66341823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档