Аккомпанемент FlowRow: можно ли автоматически прокрутить вниз, чтобы показать элемент?
В моем проекте Jetpack Compose один из моих компонентов использует от файлAccompanist . Но я не знаю, как сделать прокрутку до данного «узла».
Вот соответствующий код из моего
@Composable
:
sealed class MovesNavigatorElement(open val text: String)
data class MoveNumber(override val text: String) : MovesNavigatorElement(text)
data class HalfMoveSAN(override val text: String) : MovesNavigatorElement(text)
@Composable
fun MovesNavigator(modifier: Modifier = Modifier, elements: Array<MovesNavigatorElement>, mustBeVisibleByDefaultElementIndex: Int) {
val vertScrollState = rememberScrollState()
FlowRow(
modifier = modifier
.background(color = Color.Yellow.copy(alpha = 0.3f))
.verticalScroll(vertScrollState),
mainAxisSpacing = 10.dp,
crossAxisSpacing = 15.dp,
) {
elements.map {
Text(text = it.text, fontSize = 34.sp, color = Color.Blue, style= MaterialTheme.typography.body1)
}
}
}
Вы можете видеть, что я объявляю "узлы"
FlowRow
в виде списка: параметр
elements
. Также я использую
ScrollState
в локальной переменной
vertScrollState
.
Но, допустим, я хочу прокрутить его до
elements[30]
: как мне это сделать? Учитывая, что
mustBeVisibleByDefaultElementIndex
- это индекс элемента, который должен быть видим по умолчанию . Я имею в виду, когда происходит композиция. Но пользователь, конечно, может изменить положение позже .
2 ответа
В
ScrollState
разоблачает
scrollTo
а также
animateScrollTo
методы. Вы можете легко использовать их для достижения желаемого результата. Обратитесь к документации
Вот как мне удается (частично) решить мою проблему:
- использовать простой
ScrollState
вместо тогоrememberScrollState()
: потому что даже если я установлю фиксированное значение прокрутки при перекомпоновке, пользователь все равно сможет его перемещать. Таким образом, нет необходимости «кэшировать» значение прокрутки. - используйте преобразование sp в px для количества прокрутки, которое ожидается как значение в пикселях, и жестко запрограммированное количество деления данного индекса (поэтому оно решено только частично)
Это привело меня к следующему:
sealed class MovesNavigatorElement(open val text: String)
data class MoveNumber(override val text: String) : MovesNavigatorElement(text)
data class HalfMoveSAN(override val text: String) : MovesNavigatorElement(text)
@Composable
fun MovesNavigator(modifier: Modifier = Modifier, elements: Array<MovesNavigatorElement>, mustBeVisibleByDefaultElementIndex: Int = 0) {
val lineHeightPixels = with(LocalDensity.current) {34.sp.toPx()}
val scrollAmount = ((mustBeVisibleByDefaultElementIndex / 6) * lineHeightPixels).toInt()
val vertScrollState = ScrollState(scrollAmount)
FlowRow(
modifier = modifier
.background(color = Color.Yellow.copy(alpha = 0.3f))
.verticalScroll(vertScrollState),
mainAxisSpacing = 8.dp,
) {
elements.map {
Text(text = it.text, fontSize = 34.sp, color = Color.Blue, style= MaterialTheme.typography.body1)
}
}
}
Но все равно придется тестировать на нескольких устройствах.