Как получить процент или общее количество прокруток из прокрутки из Android Compose?

Мне нужно получить процент от общего количества прокруток на экране с помощью Android Compose с состояниями, предоставленными из ScrollState или NestedScrollState на любом экране, как получить эту информацию?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить это из полей value и maxValue класса ScrollState.

@Composable
fun ScrollTestWithColumn() {
    val formatter = remember { DecimalFormat("0.0")} // optional
    val scrollState = rememberScrollState()
    val percent = (scrollState.value.toFloat() / scrollState.maxValue.toFloat()) * 100f
    val scrollText = "scroll: ${formatter.format(percent)}"
    Box {
        Column(
            Modifier
                .fillMaxSize()
                .verticalScroll(scrollState)
        ) {
            repeat(200) {
                Text(text = "Item $it", Modifier.padding(16.dp))
            }
        }
        Text(text = scrollText, Modifier.align(Alignment.BottomEnd))
    }
}

Если вам нужно реализовать эту логику с помощью LazyColumn, я думаю, вы можете сделать это на основе видимого индекса, поскольку элементы загружаются лениво.

@Composable
fun ScrollTestWithLazyColumn() {
    val formatter = remember { DecimalFormat("0.0") }
    val scrollState = rememberLazyListState()
    val totalItemsCount = 200
    val firstVisibleIndex = scrollState.firstVisibleItemIndex
    val visibleItemsCount = scrollState.layoutInfo.visibleItemsInfo.size
    val percent = (firstVisibleIndex / (totalItemsCount - visibleItemsCount).toFloat()) * 100f
    val scrollText = "scroll: ${formatter.format(percent)}"
    Box {
        LazyColumn(
            state = scrollState,
            modifier = Modifier.fillMaxSize()
        ) {
            items(totalItemsCount) {
                Text(text = "Item $it", Modifier.padding(16.dp))
            }
        }
        Text(text = scrollText, Modifier.align(Alignment.BottomEnd))
    }
}

Я пробовал это раньше, но не работает, когда на экране есть LazyColumn. Есть ли что-нибудь еще?

João Eudes Lima 24.04.2022 00:45

Я не уверен, что это возможно для LazyColumn, поскольку элементы загружаются лениво (как следует из названия компонента). Что вы можете сделать, так это реализовать свою логику на основе видимых элементов. Я обновил свой ответ с этим предложением.

nglauber 24.04.2022 01:42

Спасибо @nglauber! Это отвечает на мой вопрос, может быть, я дал так много деталей, но я полагаю, что мне все еще понадобится общая форма между экранами, или LazyColumn может распознавать состояние прокрутки, или будет слишком много состояний для управления.

João Eudes Lima 24.04.2022 02:09

Другие вопросы по теме