Os botões de ícone mostram ações que os usuários podem realizar. Os botões de ícone precisam usar um ícone com um significado claro e geralmente representam ações comuns ou usadas com frequência.
Há dois tipos de botões de ícone:
- Padrão: esses botões podem abrir outros elementos, como um menu ou pesquisa.
- Alternar: esses botões podem representar ações binárias que podem ser ativadas ou desativadas, como "favorito" ou "marcador".
Superfície da API
Use o elemento combinável IconButton para implementar botões de ícone padrão. Para
criar diferentes estilos visuais, como preenchido, preenchido tonal ou com contorno, use
FilledIconButton, FilledTonalIconButton e
OutlinedIconButton, respectivamente.
Os principais parâmetros de IconButton incluem:
onClick: uma função lambda que é executada quando o usuário toca no botão do ícone.enabled: um booleano que controla o estado ativado do botão. Quandofalse, o botão não responde à entrada do usuário.content: o conteúdo combinável dentro do botão, normalmente umIcon.
Exemplo básico: botão de ícone de ativação
Este exemplo mostra como implementar um botão de ícone de alternância. Um botão de ícone de alternância muda a aparência dependendo se ele está selecionado ou não.
@Preview @Composable fun ToggleIconButtonExample() { // isToggled initial value should be read from a view model or persistent storage. var isToggled by rememberSaveable { mutableStateOf(false) } IconButton( onClick = { isToggled = !isToggled } ) { Icon( painter = if (isToggled) painterResource(R.drawable.favorite_filled) else painterResource(R.drawable.favorite), contentDescription = if (isToggled) "Selected icon button" else "Unselected icon button." ) } }
Pontos principais sobre o código
- O elemento combinável
ToggleIconButtonExampledefine umIconButtoncom alternância.mutableStateOf(false)cria um objetoMutableStateque contém um valor booleano, inicialmentefalse. Isso tornaisToggledum detentor de estado, o que significa que o Compose recompõe a interface sempre que o valor muda.- O
rememberSaveablegarante que o estado doisToggledpersista em mudanças de configuração, como a rotação da tela.
- O lambda
onClickdoIconButtondefine o comportamento do botão quando é clicado, alternando o estado entretrueefalse. - O parâmetro
painterdo elemento combinávelIconcarrega condicionalmente umpainterResourcediferente com base no estadoisToggled. Isso muda a aparência do ícone.- Se
isToggledfortrue, ele vai carregar o drawable de coração preenchido. - Se
isToggledforfalse, ele vai carregar o drawable de coração delineado.
- Se
- O
contentDescriptiondoIcontambém é atualizado com base no estadoisToggledpara fornecer informações de acessibilidade adequadas.
Resultado
A imagem a seguir mostra o botão de ícone de alternância do snippet anterior no estado não selecionado:
Exemplo avançado: ações repetidas ao pressionar
Esta seção demonstra como criar botões de ícone que acionam continuamente uma ação enquanto o usuário pressiona e mantém o botão, em vez de acionar uma vez por clique.
@Composable fun MomentaryIconButton( unselectedImage: Int, selectedImage: Int, contentDescription: String, modifier: Modifier = Modifier, stepDelay: Long = 100L, // Minimum value is 1L milliseconds. onClick: () -> Unit ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() val pressedListener by rememberUpdatedState(onClick) LaunchedEffect(isPressed) { while (isPressed) { delay(stepDelay.coerceIn(1L, Long.MAX_VALUE)) pressedListener() } } IconButton( modifier = modifier, onClick = onClick, interactionSource = interactionSource ) { Icon( painter = if (isPressed) painterResource(id = selectedImage) else painterResource(id = unselectedImage), contentDescription = contentDescription, ) } }
Pontos principais sobre o código
MomentaryIconButtonrecebe umunselectedImage: Int, o ID do recurso drawable do ícone quando o botão não está pressionado, eselectedImage: Int, o ID do recurso drawable do ícone quando o botão está pressionado.- Ele usa um
interactionSourcepara rastrear especificamente as interações de "pressionar" do usuário. isPressedé verdadeiro quando o botão está sendo pressionado ativamente e falso caso contrário. QuandoisPressedétrue, oLaunchedEffectentra em um loop.- Dentro desse loop, ele usa um
delay(comstepDelay) para criar pausas entre as ações de acionamento.coerceIngarante que o atraso seja de pelo menos 1 ms para evitar loops infinitos. - O
pressedListeneré invocado após cada atraso no loop. Isso faz com que a ação seja repetida.
- Dentro desse loop, ele usa um
- O
pressedListenerusarememberUpdatedStatepara garantir que a lambdaonClick(a ação a ser realizada) seja sempre a mais atualizada da composição mais recente. - O
Iconmuda a imagem exibida de acordo com se o botão está pressionado ou não.- Se
isPressedfor verdadeiro, oselectedImageserá mostrado. - Caso contrário, o
unselectedImageserá mostrado.
- Se
Em seguida, use este MomentaryIconButton em um exemplo. O snippet a seguir
demonstra dois botões de ícone que controlam um contador:
@Preview() @Composable fun MomentaryIconButtonExample() { var pressedCount by remember { mutableIntStateOf(0) } Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { MomentaryIconButton( unselectedImage = R.drawable.fast_rewind, selectedImage = R.drawable.fast_rewind_filled, stepDelay = 100L, onClick = { pressedCount -= 1 }, contentDescription = "Decrease count button" ) Spacer(modifier = Modifier) Text("advanced by $pressedCount frames") Spacer(modifier = Modifier) MomentaryIconButton( unselectedImage = R.drawable.fast_forward, selectedImage = R.drawable.fast_forward_filled, contentDescription = "Increase count button", stepDelay = 100L, onClick = { pressedCount += 1 } ) } }
Pontos principais sobre o código
- O elemento combinável
MomentaryIconButtonExamplemostra umRowcontendo duas instânciasMomentaryIconButtone um elemento combinávelTextpara criar uma interface para incrementar e decrementar um contador. - Ele mantém uma variável de estado mutável
pressedCountusandorememberemutableIntStateOf, inicializada como 0. QuandopressedCountmuda, todos os elementos combináveis que o observam (como o elemento combinávelText) são recompostas para refletir o novo valor. - O primeiro
MomentaryIconButtondiminuipressedCountquando clicado ou pressionado. - O segundo
MomentaryIconButtonaumentapressedCountquando clicado ou mantido pressionado. - Ambos os botões usam um
stepDelayde 100 milissegundos, o que significa que a açãoonClické repetida a cada 100 ms enquanto um botão é mantido pressionado.
Resultado
O vídeo a seguir mostra a interface com os botões de ícone e o contador: