Android Compose实现上滑LazyColumn时隐藏TopBar的方法
Android Compose实现上滑LazyColumn隐藏TopBar
直接给你改造后的完整代码,关键逻辑都加了注释:
@Composable fun PostScreen(postData: List<Post>) { // 定义LazyColumn的滚动状态 val lazyListState = rememberLazyListState() // 记录上一次的滚动位置,用来判断滚动方向 var lastScrollPosition by remember { mutableStateOf(0) } // 标记是否正在上滑 var isScrollingUp by remember { mutableStateOf(false) } // TopBar的默认高度(如果是自定义TopBar,可替换成你自己的固定高度) val topBarHeight = TopAppBarDefaults.smallTopAppBarHeight // 根据滚动方向生成TopBar的偏移动画 val topBarOffset by animateDpAsState( targetValue = if (isScrollingUp) -topBarHeight else 0.dp, animationSpec = tween(durationMillis = 300) ) // 监听滚动状态变化,判断滚动方向 LaunchedEffect(lazyListState) { snapshotFlow { lazyListState.firstVisibleItemScrollOffset } .collect { currentOffset -> isScrollingUp = currentOffset < lastScrollPosition lastScrollPosition = currentOffset } } Scaffold( topBar = { // 给TopBar应用偏移动画 PostTopBar( modifier = Modifier.offset(y = topBarOffset) ) } ){ innerPadding -> CompositionLocalProvider( LocalOverscrollConfiguration provides null ) { LazyColumn( state = lazyListState, // 关联滚动状态 horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier .padding(innerPadding) .fillMaxWidth() ) { items(postData.size) { Column { Post(postData = postData[it], index = it) } } } } } }
关键逻辑说明
- 用
rememberLazyListState获取LazyColumn的滚动状态,通过snapshotFlow监听滚动偏移量的变化,对比上一次的位置判断是上滑还是下滑。 animateDpAsState负责处理TopBar的平滑偏移动画,上滑时让TopBar向上移出屏幕(偏移量为负的自身高度),下滑时恢复到原位置。- 如果你的
PostTopBar是自定义组件且高度不是默认值,把topBarHeight替换成你自定义的高度值即可,比如64.dp。
内容的提问来源于stack exchange,提问作者HamTory
相关产品推荐
相关产品推荐

