gpt4 book ai didi

android - 通过 ComposeView 互操作在 CoordinatorLayout 内编写 LazyColumn 滚动行为

转载 作者:行者123 更新时间:2023-12-04 23:41:28 33 4
gpt4 key购买 nike

问题 - 向下滚动会导致底部工作表滚动而不是滚动优先级给 LazyColumn(RecyclerView 没有这个问题。它被 NestedScrollView 包裹)
我刚刚在 CoordinatorLayout 中引入了一个 Compose LazyColumn 替换 Recycler。 Coordinator(作为底部工作表实现)本身可以在查看和展开状态之间自由滚动。我的问题是在 LazyColumn 中向下拖动项目区域时,底部工作表会拾取滚动而不是 LazyColumn 。如果我在 LazyColumn 上先向上然后向下滚动(不释放),则滚动由 LazyColumn 拾取,并且滚动优先级赋予 LazyColumn(预期行为。)

BottomSheetFragment
|-CoordinatorLayout
|--ConstraintLayout (BottomSheetBehavior)
|---MyListFragment
|----ComposeView
|-----Theme
|------Surface
|-------Box
|--------LazyColumn
Compose 新手,所以我希望有人能告诉我如何纠正这种新的滚动行为?
** 编辑
我通过切换协调器的 ^^ BottomSheetBehavior.isDraggable 来完成这项工作,但它确实需要我释放拖动而不是从列表滚动平滑过渡到底部工作表滚动 - 有人建议修复吗? :
fun MyUi(listener:Listener) {
val listState = rememberLazyListState()

LaunchedEffect(listState) {
listState.interactionSource.interactions.collect {
//at the top of the list so allow sheet scrolling
listener.allowSheetDrag(listState.firstVisibleItemScrollOffset == 0)
}
}

val nestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
Timber.i("NestedScrollConnection onPreScroll($available: Offset, $source: NestedScrollSource)")
return super.onPreScroll(available, source)
}

override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset {
Timber.i("NestedScrollConnection onPostScroll($consumed: Offset, $available: Offset, $source: NestedScrollSource)")
if (available.y > 0.0 && consumed.y == 0.0f) {
//scolling down up but we're already at the top - kick over to sheet scrolling
listener.allowSheetDrag(true)
}
return super.onPostScroll(consumed, available, source)
}
}
}
Box(
modifier = Modifier
.fillMaxSize()
.nestedScroll(nestedScrollConnection)
) {
LazyColumn(
modifier =
Modifier
.fillMaxSize()
.padding(vertical = 12.dp), state = listState
) {
item {
Row() {}
}
}
}
}
然后在 fragment 中:
override fun allowSheetDrag(allowSheetDrag: Boolean) {
bottomSheetFragment?.bottomSheetBehavior?.isDraggable = allowSheetDrag
}

最佳答案

Wizard Chris Banes 最近发布了一个解决方法,我可以确认它有效:https://gist.github.com/chrisbanes/053189c31302269656c1979edf418310
当在 BottomSheetDialog 中使用时,它也可以很好地过渡而无需抬起手指。 (向上滚动,然后一口气将工作表向下拖动)
示例用法 (取自 Chris Banes 的示例):

setContent {
Surface(
// Add this somewhere near the top of your layout, above any scrolling layouts
modifier = Modifier.nestedScroll(rememberViewInteropNestedScrollConnection())
) {
LazyColumn() {
// blah
}
}
}
使用 ComposeViews 跟踪嵌套滚动时存在问题: https://issuetracker.google.com/issues/174348612 ,以及一个相关的 SO 问题将我带到那里: AndroidView in Compose loses touch events in NestedScrollView

关于android - 通过 ComposeView 互操作在 CoordinatorLayout 内编写 LazyColumn 滚动行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69770777/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com