Вот снимок экрана:

Первые 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)
)
}
}
}
Код: Выделить всё
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 в отдельном блоке запуска, но это не сработало; в этом случае прокрутка вообще отсутствует.
Вы можете увидеть полный исходный код в репозитории по адресу https://github.com/geekarist/perf-carousel.
Подробнее здесь: https://stackoverflow.com/questions/724 ... g-the-dpad