kotlin 自定义折叠TopAppBar Jetpack合成

ajsxfq5m  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(169)

问题的实质是我想编写自己的AppBar版本,它将内容作为另一个Compose函数包含在内。在查看当前CollapsingTopAppBar实现的源代码后,我看到了以下几行:

@Composable
private fun TwoRowsTopAppBar(
    ...
    scrollBehavior: TopAppBarScrollBehavior?
) {
    ...
    val pinnedHeightPx: Float = 64.dp
    val maxHeightPx: Float = 152.dp

    LocalDensity.current.run {
        pinnedHeightPx = pinnedHeight.toPx()
        maxHeightPx = maxHeight.toPx()
    }
    // Sets the app bar's height offset limit to hide just the bottom title area and keep top title
    // visible when collapsed.
    SideEffect {
        if (scrollBehavior?.state?.heightOffsetLimit != pinnedHeightPx - maxHeightPx) {
            scrollBehavior?.state?.heightOffsetLimit = pinnedHeightPx - maxHeightPx
        }
    }
    ...
    Surface(...) {
        Column {
            TopAppBarLayout(
                ...
                heightPx = pinnedHeightPx
                ...
            )
            TopAppBarLayout(
                ...
                heightPx = maxHeightPx - pinnedHeightPx + (scrollBehavior?.state?.heightOffset
                   ?: 0f),
                ...
            )
        }
    }
}

据我所知,scrollBehavior用于处理折叠和展开行为。在当前的实现中,只有常量值被放入heightOffsetLimit。由于我需要我的appbar实现能够包含任何大小的内容,我需要以某种方式提前知道这些内容的大小,并将该值放入heightOffsetLimit
我已经为AppBar编写了代码,使其也包含内容,但由于我无法将内容的高度值传递给scrollBehavior,因此AppBar不会折叠到末尾。

rkue9o1l

rkue9o1l1#

你需要计算的高度,应用程序栏将有之前,提请到屏幕上。我已经跟进了这个问题,并解决了我的问题与最后的解决方案。希望它有帮助:
Get height of element Jetpack Compose

  • 使用您可以放置的内容(例如,图像或大文本)作为主内容
  • 使用appbar作为DependentContent,并使用lambda中给定的大小为appbar指定高度
  • 最后,我将placeMainContent设置为false,因为我相信您不需要直接在框中绘制图像(或任何其他可组合的图像

你就可以走了

相关问题