No Glimmer do Jetpack Compose, o surface componente é um elemento básico fundamental que representa uma área visual distinta ou um limite físico para componentes como botões e fichas de informações.
Uma superfície é responsável pelas seguintes propriedades visuais e físicas:
- Recorte: recorta os filhos em uma forma especificada.
- Borda: desenha uma borda interna para enfatizar o limite do componente. Quando focado, ele desenha uma borda mais larga com um destaque.
- Segundo plano: aplica uma cor de segundo plano à área da superfície.
- Efeitos de profundidade: renderiza
DepthEffectsombras com base no estado do componente (como padrão versus focado). - Cor do conteúdo: fornece uma cor para texto e ícones dentro da superfície, calculada por padrão na cor de segundo plano.
- Estados de interação: desenha uma sobreposição pressionada quando a superfície é pressionada e uma borda mais larga com um destaque quando focada.
Exemplo: criar uma superfície
O código a seguir cria uma superfície com recorte, um segundo plano e bordas padrão:
@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") } }
Principais pontos sobre o código
Origem de interação compartilhada: ambos .
surface()e .clickable()precisam compartilhar a mesmainteractionSource. Isso garante que os estados visuais (como pressionar ou focar) sejam sincronizados, permitindo que a superfície reaja visualmente à entrada do usuário.Ordenação de modificadores: a sequência de modificadores é essencial. Como .
surface()recorta um layout, colocá-lo antes de .clickable()garante que a área de toque seja restrita à forma da superfície. Se .clickable()vier primeiro, a área de interação poderá se estender além dos limites visíveis e recortados do componente.
SurfaceDepthEffect
A classe SurfaceDepthEffect gerencia a transição de sombras entre
estados de interação:
depthEffect: o efeito de sombra usado quando a superfície está no estado padrão.focusedDepthEffect: o efeito de sombra usado quando a superfície está focada.