Как я могу поместить LazyColumn в составной элемент Swipeable и прокручивать его, когда столбец находится вверху?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу поместить LazyColumn в составной элемент Swipeable и прокручивать его, когда столбец находится вверху?

Сообщение Anonymous »

Я создаю средство запуска Android с использованием Kotlin и Jetpack Compose и хочу реализовать панель приложений, аналогичную Pixel Launcher. Ящик выдвигается вверх с помощью LazyColumn для отображения списка приложений. Я хочу, чтобы LazyColumn разрешал прокрутку, но если пользователь находится в верхней части списка, я хочу, чтобы жест смахивания вниз закрывал ящик, а не переворачивал список.
Проблема, с которой я столкнулся Я столкнулся с тем, что поведение прокрутки LazyColumn переопределяет модификатор .swipeable() в Box. Когда пользователь находится в верхней части LazyColumn, я хочу, чтобы жест смахивания вниз закрывал ящик. Однако список просто подпрыгивает, а не вызывает действие пролистывания.
Вот минимальный воспроизводимый пример моего текущего кода:

Код: Выделить всё

@OptIn(ExperimentalWearMaterialApi::class)
@Composable
fun SwipeableHome() {
val appDrawSize = 1000.dp
val swipeableState = rememberSwipeableState(1)
val sizePx = with(LocalDensity.current) { appDrawSize.toPx() }
val anchors = mapOf(0f to 0, sizePx to 1) // Maps anchor points (in px) to states
val appsListScrollState = rememberLazyListState()

Box(
modifier = Modifier
.fillMaxSize()
.swipeable(
state = swipeableState,
anchors = anchors,
thresholds = { _, _ -> FractionalThreshold(0.3f) },
orientation = Orientation.Vertical,
enabled = isAppDrawAtTop.value
)
) {
Text("Home")
AppsList()
}
}

@Composable
fun AppsList() {
Box(
modifier = Modifier
.fillMaxSize()
.offset { IntOffset(0, swipeableState.offset.value.roundToInt()) }
) {
LazyColumn(
state = appsListScrollState,
modifier = Modifier
.offset { IntOffset(0, swipeableState.offset.value.roundToInt()) }
.fillMaxHeight()
) {
items(sortedInstalledApps) { app ->
AppsListItem(app)
}
}
}
}
Я пробовал использовать NestedScroll, чтобы определить, когда пользователь проводит пальцем по верхней части списка, и отключить прокрутку LazyColumn, но в результате требуется два пролистывания: первое пролистывание отключает прокрутку , а второй закрывает ящик.
Есть ли лучший способ обработать это взаимодействие, чтобы смахивание вниз вверху списка плавно закрывало ящик?

Что я пробовал:
Вот пример моей попытки вложенной прокрутки, для закрытия которой требуется два смахивания:

Код: Выделить всё

val isAppDrawAtTop = remember {
derivedStateOf { appsListScrollState.firstVisibleItemIndex == 0 && appsListScrollState.firstVisibleItemScrollOffset == 0 }
}
LazyColumn(
state = appsListScrollState,
modifier = Modifier
.offset { IntOffset(0, swipeableState.offset.value.roundToInt()) }
.fillMaxSize()
.nestedScroll(remember {
object : androidx.compose.ui.input.nestedscroll.NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
return if (available.y > 0 && isAppDrawAtTop.value) {
shouldScroll.value = false
Offset.Zero
} else {
shouldScroll.value = true
super.onPreScroll(available, source)
}
}
}
}),
userScrollEnabled = shouldScroll.value
) {
items(sortedInstalledApps) { app ->
SwipeAppsListItem(app)
}
}
Будем очень признательны за любую помощь. 👍

Подробнее здесь: https://stackoverflow.com/questions/790 ... e-when-the
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как я могу поместить LazyColumn в составной элемент Swipeable и прокручивать его, когда столбец находится вверху?
    Anonymous » » в форуме Android
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как LazyColumn/LazyRow извлекает каждый составной элемент из блока элементов
    Anonymous » » в форуме Android
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Как автоматически прокручивать LazyColumn при подъеме или опускании клавиатуры в Android
    Anonymous » » в форуме Android
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Jetpack пишет, как прокручивать весь экран с помощью lazycolumn
    Anonymous » » в форуме Android
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Jetpack пишет, как прокручивать весь экран с помощью lazycolumn
    Anonymous » » в форуме Android
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»