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 focalizada, ela desenha uma borda mais larga com um destaque.
- Plano de fundo: aplica uma cor de plano de fundo à área da superfície.
- Efeitos de profundidade: renderiza
DepthEffectsombras com base no estado do componente (como padrão versus focalizado). - Cor do conteúdo: fornece uma cor para texto e ícones dentro da superfície, calculada por padrão com base na cor de plano de fundo.
- Estados de interação: desenha uma sobreposição pressionada quando a superfície é pressionada e uma borda mais larga com um destaque quando focalizada.
Exemplo: criar uma superfície
O código a seguir cria uma superfície com recorte, um plano de fundo e bordas padrão:
@Composable
fun SurfaceSample() {
Box(Modifier.surface().padding(horizontal = 24.dp, vertical = 20.dp)) {
Text("This is a surface")
}
}
Interação e foco
As superfícies não são focalizáveis por padrão, então os usuários não podem interagir com elas. Na maioria dos casos, as superfícies precisam ser interativas para permitir que os usuários movam o foco e naveguem entre os componentes de maneira consistente. É possível usar o modificador focusable do Compose
para superfícies que só podem ser focalizáveis. Da mesma forma, você pode criar uma superfície clicável
usando o modificador clickable do Compose. Também é possível usar outros modificadores para superfícies que exigem ações.
O código a seguir mostra exemplos de superfícies focalizáveis e clicáveis:
@Composable fun FocusableSurfaceSample() { val interactionSource = remember { MutableInteractionSource() } Box( modifier = Modifier .size(100.dp) .surface(interactionSource = interactionSource) .focusable(interactionSource = interactionSource), contentAlignment = Alignment.Center ) { Text("Focusable") } } @Composable fun ClickableSurfaceSample() { val interactionSource = remember { MutableInteractionSource() } Box( modifier = Modifier .size(100.dp) .surface(interactionSource = interactionSource) .focusable(interactionSource = interactionSource) .clickable( interactionSource = interactionSource, indication = null ) { /* Handle click action */ }, contentAlignment = Alignment.Center ) { Text("Clickable") } }
Principais pontos sobre o código
Origem de interação compartilhada para superfícies focalizáveis:
.surface()e.focusable()precisam compartilhar a mesmainteractionSource. Isso permite que a superfície reaja às mudanças de foco.Origem de interação compartilhada para superfícies clicáveis:
.surface()e.clickable()precisam compartilhar a mesmainteractionSource. Isso garante que os estados visuais (como pressionar ou focalizar) sejam sincronizados, permitindo que a superfície reaja visualmente à entrada do usuário.Ordenação de modificadores: a sequência de modificadores é fundamental. 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á focalizada.