Предоставляйте визуальные подсказки для облегчения визуализации фокуса.
Хотя все фокусируемые элементы из Material Theme уже имеют стиль фокуса, соответствующий теме, вам может потребоваться добавить некоторые визуальные элементы, чтобы элемент, находящийся в фокусе, было легче обнаружить. Хорошим решением было бы изменить границу вашего элемента на цвет, который хорошо контрастирует с фоном:
var color by remember { mutableStateOf(Color.White) } Card( modifier = Modifier .onFocusChanged { color = if (it.isFocused) Red else White } .border(5.dp, color) ) {}
В этом примере remember
используется для сохранения цвета границы при рекомпозиции, а контур элемента обновляется каждый раз, когда элемент получает или теряет фокус.
Внедряйте расширенные визуальные подсказки
С помощью Jetpack Compose вы также можете создавать более сложные и продвинутые визуальные подсказки, которые лучше соответствуют вашему пользовательскому интерфейсу.
- Сначала создайте
IndicationInstance
, который визуально отображает нужный вам сигнал в вашем пользовательском интерфейсе:private class MyHighlightIndicationInstance(isEnabledState: State<Boolean>) : IndicationInstance { private val isEnabled by isEnabledState override fun ContentDrawScope.drawIndication() { drawContent() if (isEnabled) { drawRect(size = size, color = Color.White, alpha = 0.2f) } } }
- Затем создайте
Indication
и запомните состояние фокусировки:class MyHighlightIndication : Indication { @Composable override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance { val isFocusedState = interactionSource.collectIsFocusedAsState() return remember(interactionSource) { MyHighlightIndicationInstance(isEnabledState = isFocusedState) } } }
- Добавьте в пользовательский интерфейс
Indication
иInteractionSource
с помощьюindication()
:val highlightIndication = remember { MyHighlightIndication() } var interactionSource = remember { MutableInteractionSource() } Card( modifier = Modifier .clickable( interactionSource = interactionSource, indication = highlightIndication, enabled = true, onClick = { } ) ) {}
Понять состояние фокуса
Как правило, каждый раз, когда состояние фокуса изменяется, FocusEvent
запускается вверх по дереву, и родители модификатора focusable()
могут прослушивать его с помощью модификатора onFocusChanged()
.
Если вам нужно узнать состояние фокуса, вы можете использовать эти API в сочетании с модификатором onFocusChanged
:
-
isFocused
возвращаетtrue
, если составной объект, к которому прикреплен модификатор, находится в фокусе. -
hasFocus
работает аналогичноisFocused
, но с существенным отличием: вместо проверки только текущего элемента он проверяет, сфокусирован ли элемент или один из его дочерних элементов. -
isCaptured
возвращаетtrue
всякий раз, когда фокус удерживается. Это происходит, например, когдаTextField
содержит неправильные данные, поэтому попытка сфокусировать другие элементы не приведет к очистке фокуса.
Эти поля показаны ниже:
Modifier.onFocusChanged {
val isFocused = it.isFocused
val hasFocus = it.hasFocus
val isCaptured= it.isCaptured
}
Рекомендуется для вас
- Примечание. Текст ссылки отображается, когда JavaScript отключен.
- Изменение поведения фокуса
- Material Design 2 в Compose
- Обработка ввода пользователя