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: