Предоставляйте визуальные подсказки для облегчения визуализации фокуса.
Хотя все фокусируемые элементы из 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 MyHighlightIndicationNode(private val interactionSource: InteractionSource) : Modifier.Node(), DrawModifierNode { private var isFocused = false override fun onAttach() { coroutineScope.launch { var focusCount = 0 interactionSource.interactions.collect { interaction -> when (interaction) { is FocusInteraction.Focus -> focusCount++ is FocusInteraction.Unfocus -> focusCount-- } val focused = focusCount > 0 if (isFocused != focused) { isFocused = focused invalidateDraw() } } } } override fun ContentDrawScope.draw() { drawContent() if (isFocused) { drawRect(size = size, color = Color.White, alpha = 0.2f) } } }
- Затем создайте
Indicationи запомните состояние фокусировки:object MyHighlightIndication : IndicationNodeFactory { override fun create(interactionSource: InteractionSource): DelegatableNode { return MyHighlightIndicationNode(interactionSource) } override fun hashCode(): Int = -1 override fun equals(other: Any?) = other === this }
- Добавьте в пользовательский интерфейс
IndicationиInteractionSourceс помощьюindication():var interactionSource = remember { MutableInteractionSource() } Card( modifier = Modifier .clickable( interactionSource = interactionSource, indication = MyHighlightIndication, enabled = true, onClick = { } ) ) { Text("hello") }
Понять состояние фокуса
Как правило, каждый раз, когда состояние фокуса изменяется, 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
- Обработка ввода пользователя