NestedScrollConnectionを使ってスクロール可能な要素をスクロールした際のコールバックを受け取って、要素の高さを計算すればOK
@Composable
fun Screen() {
val density = LocalDensity.current
val defaultToolBarHeight = 120.dp
val minToolBarHeight = 48.dp
var toolBarHeight by remember {
mutableStateOf(defaultToolBarHeight)
}
val nestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
val delta = available.y
// ここでスクロールに合わせて高さを計算する
toolBarHeight = with(density) {
(toolBarHeight.toPx() + delta).coerceIn(minToolBarHeight.toPx(), defaultToolBarHeight.toPx()).toDp()
}
return Offset.Zero
}
}
}
Column(
modifier = Modifier.nestedScroll(nestedScrollConnection),
) {
TopAppBar(
modifier = Modifier.height(toolBarHeight)
) {
// 略
}
// この要素をスクロールするとTopAppBarの高さが変化する
LazyVerticalGrid(
) {
// 略
}
}
}
こんな感じの構造にするとsheetContentをスワイプして消そうとすると一緒にTopAppBarの高さも変わってしまうのでContent側で上記のようにコンテンツ部分でTopAppBarを管理する必要がある
BottomSheetScaffold(
modifier = Modifier.nestedScroll(nestedScrollConnection),
topBar = {
TopAppBar(
modifier = Modifier.height(toolBarHeight)
) {
// 略
}
},
sheetContent = {
Column {
// 略
}
}
) {
LazyVerticalGrid() {
// 略
}
}