Как быстрее прокручивать LazyRow с помощью dpad?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как быстрее прокручивать LazyRow с помощью dpad?

Сообщение Anonymous »

Я пытаюсь реализовать компонент карусели на Android TV с помощью Compose, и у меня возникла проблема с быстрой прокруткой с помощью dpad. Примечание. Я хочу, чтобы выбранный элемент отображался первым на экране.
Вот снимок экрана:
Изображение

Первые 5 элементов прокручиваются нажатием и отпусканием правой клавиши после каждого элемент. Следующие 15 элементов прокручиваются при нажатой правой клавише до конца списка.
Прокрутка и управление фокусом работают хорошо, но хотелось бы сделать это быстрее. На снимке экрана вы видите, что при нажатии правой клавиши список прокручивается затем следующий элемент получает фокус. Это очень медленно.
Вот функция Composable:

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

@Composable
private fun CustomLazyRow() {
val scrollState = rememberLazyListState()

LazyRow(
state = scrollState,
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
itemsIndexed(
items = (1..20).toList()
) { index, item ->
var isFocused by remember { mutableStateOf(false) }
Text(
text = "Item $item",
modifier = Modifier
.dpadNavigation(scrollState, index)
.width(156.dp)
.aspectRatio(4 / 3F)
.onFocusChanged { isFocused = it.isFocused }
.focusable()
.border(if (isFocused) 4.dp else Dp.Hairline, Color.Black)
)
}
}
}
И функция-модификатор dpadNavigation:

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

fun Modifier.dpadNavigation(
scrollState: LazyListState,
index: Int
) = composed {
val focusManager = LocalFocusManager.current
var focusDirectionToMove by remember { mutableStateOf(null) }
val scope = rememberCoroutineScope()

onKeyEvent {
if (it.type == KeyEventType.KeyDown) {
when (it.nativeKeyEvent.keyCode) {
KeyEvent.KEYCODE_DPAD_LEFT -> focusDirectionToMove = FocusDirection.Left
KeyEvent.KEYCODE_DPAD_RIGHT -> focusDirectionToMove = FocusDirection.Right
}
if (focusDirectionToMove != null) {
scope.launch {
if (focusDirectionToMove == FocusDirection.Left && index > 0) {
// This does not work:
// scope.launch { scrollState.animateScrollToItem(index - 1) }
scrollState.animateScrollToItem(index - 1)
focusManager.moveFocus(FocusDirection.Left)
}
if (focusDirectionToMove == FocusDirection.Right) {
// scope.launch { scrollState.animateScrollToItem(index + 1) }
scrollState.animateScrollToItem(index + 1)
focusManager.moveFocus(FocusDirection.Right)
}
}
}
}
true
}
}
Я думал, что это вызвано функцией animateScrollToItem, которая должна была завершиться перед выполнением moveFocus.
Поэтому я попробовал выполнить animateScrollToItem в отдельном блоке запуска, но это не сработало; в этом случае прокрутка вообще отсутствует.
Вы можете увидеть полный исходный код в репозитории по адресу https://github.com/geekarist/perf-carousel.

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Метод DispatchKeyEvent не получает события DPAD (справа, слева, вверх и вниз), когда включена доступность
    Anonymous » » в форуме Android
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Обработайте Talkback в приложении Xamarin, используя виртуальный DPAD
    Anonymous » » в форуме Android
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Получение более быстрых выводов тем быстрее, чем быстрее я вызываю функцию
    Гость » » в форуме Python
    0 Ответы
    138 Просмотры
    Последнее сообщение Гость
  • Jetpack Compose — общие состояния прокрутки с помощью lazyrow и столбцов
    Anonymous » » в форуме Android
    0 Ответы
    48 Просмотры
    Последнее сообщение Anonymous
  • Как составить элементы, находящиеся за кадром, с помощью LazyColumn или LazyRow?
    Anonymous » » в форуме Android
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

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