提供視覺提示,讓焦點變得更加容易
儘管 Material 主題中的所有可聚焦元素都已有焦點樣式 您可能需要加入一些視覺元素 以便找出焦點所在理想的做法是將 元素的顏色與背景形成明顯對比:
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 還能讓您製作更複雜、更進階的視覺元素 還會顯示更適合您 UI 的提示
- 首先建立
IndicationInstance
,在 UI 中以視覺化方式繪製所需提示: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()
修飾符將Indication
和InteractionSource
新增至 UI: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 關閉時顯示連結文字
- 變更焦點行為
- Compose 中的質感設計 2
- 處理使用者輸入內容