W Jetpack Compose Glimmer komponent surface jest podstawowym elementem składowym, który reprezentuje odrębny obszar wizualny lub fizyczną granicę komponentów, takich jak przyciski i karty.
Platforma odpowiada za te właściwości wizualne i fizyczne:
- Przycinanie: przycina elementy podrzędne do określonego kształtu.
- Obramowanie: rysuje obramowanie wewnętrzne, aby podkreślić granicę komponentu. Gdy jest aktywny, rysuje szerszą ramkę z wyróżnieniem.
- Tło: stosuje kolor tła do obszaru.
- Efekty głębi: renderuje
DepthEffectcienie na podstawie stanu komponentu (np. domyślnego lub aktywnego). - Kolor treści: określa kolor tekstu i ikon na powierzchni, domyślnie obliczany na podstawie koloru tła.
- Stany interakcji: rysuje nakładkę po naciśnięciu powierzchni i szerszą obwódkę z podświetleniem, gdy jest zaznaczona.
Przykład: tworzenie powierzchni
Poniższy kod tworzy powierzchnię z przycinaniem, tłem i domyślnymi obramowaniami:
@Composable fun SurfaceSample() { Box(Modifier.surface().padding(horizontal = 24.dp, vertical = 20.dp)) { Text("This is a surface") } }
Interaction and Focus
Surfaces aren't focusable by default, so users can't interact with them. In most
cases, surfaces should be interactive to let users consistently move focus and
navigate between components. You can use the Compose focusable modifer
for surfaces that are only intended to be focusable, or the Compose
clickable modifer and other modifiers for surfaces that require actions.
You can create a focusable surface by combining a surface modifier with the
focusable modifier:
@Composable fun FocusableSurfaceSample() { val interactionSource = remember { MutableInteractionSource() } Box( Modifier.surface( // Provide the same interaction source here and to focusable to make sure that // surface appears focused when interacted with. interactionSource = interactionSource ) .focusable(interactionSource = interactionSource) .padding(horizontal = 24.dp, vertical = 20.dp) ) { Text("This is a focusable surface") } }
Key points about the code
- Shared interaction source: Both .
surface()and .focusable()must share the sameinteractionSource. This lets the surface react to focus changes.
Similarly, you can create a clickable surface:
@Composable fun ClickableSurfaceSample() { val interactionSource = remember { MutableInteractionSource() } Box( Modifier.surface( // Provide the same interaction source here and to clickable to make sure that // surface appears focused and pressed when interacted with interactionSource = interactionSource ) .clickable(interactionSource = interactionSource, onClick = {}) .padding(horizontal = 24.dp, vertical = 20.dp) ) { Text("This is a clickable surface") } }
Najważniejsze informacje o kodzie
Udostępnione źródło interakcji: oba .
surface()i .clickable()musi mieć ten saminteractionSource. Dzięki temu stany wizualne (np. naciśnięcie lub fokus) są zsynchronizowane, co pozwala urządzeniu reagować wizualnie na działania użytkownika.Kolejność modyfikatorów: kolejność modyfikatorów ma kluczowe znaczenie. Bo.
surface()przycina układ, umieszczając go przed .clickable()zapewnia, że docelowy element dotykowy jest ograniczony do kształtu powierzchni. Jeśliclickable()jest na pierwszym miejscu, obszar interakcji może wykraczać poza widoczne, przycięte granice komponentu.
SurfaceDepthEffect
Klasa SurfaceDepthEffect zarządza przejściem cieni między stanami interakcji:
depthEffect: efekt cienia używany, gdy powierzchnia jest w stanie domyślnym.focusedDepthEffect: efekt cienia używany, gdy powierzchnia jest zaznaczona.