WhatsApp para Android: como criar navegação flutuante em Compose

WhatsApp para Android: como criar navegação flutuante em Compose

A mudança em teste no WhatsApp para Android parece pequena — uma barra inferior com cantos arredondados e margens laterais —, mas mexe numa área crítica da interface: a navegação principal. Segundo o Sapo.pt, os primeiros sinais apareceram na versão beta 2.26.38.10. Para quem desenvolve, o ponto interessante não é apenas a aparência: é como um componente flutuante altera hierarquia visual, área útil, acessibilidade e comportamento em diferentes tamanhos de ecrã.

O que muda na navegação do WhatsApp para Android

Hoje, a navegação inferior tradicional costuma ocupar toda a largura do ecrã e encostar às bordas. A proposta identificada na versão beta destaca essa barra do conteúdo: ela ganha margens, formato arredondado e aparência de elemento suspenso sobre a interface.

Os atalhos continuam a servir áreas centrais do aplicativo, como conversas, atualizações e chamadas. A mudança, portanto, não exige que o utilizador reaprenda o que cada opção faz. O que muda é a forma como a navegação se separa visualmente do conteúdo.

É importante não tratar uma captura de uma versão de testes como confirmação de lançamento. O recurso ainda não estava disponível para todos os utilizadores beta, segundo a reportagem. A Meta pode ajustar dimensões, cores, animações ou até recuar antes de distribuir a interface de forma ampla.

Por que uma barra flutuante muda a experiência

Uma barra com margens laterais deixa de parecer parte da moldura do aplicativo e passa a ser percebida como um controlo sobreposto. Essa distinção pode tornar o conteúdo mais organizado, especialmente em ecrãs grandes, nos quais uma barra de ponta a ponta ocupa uma área visual considerável.

Mas “flutuante” não significa automaticamente “melhor”. A barra pode cobrir mensagens, disputar atenção com botões de ação ou ficar demasiado próxima da área de gestos do Android. O resultado depende de espaçamento, contraste, elevação, posição e comportamento durante a rolagem.

Na minha experiência com interfaces responsivas, o erro é avaliar esse tipo de componente apenas numa imagem estática. A navegação precisa funcionar com conteúdo longo, teclado aberto, texto ampliado, modo escuro, navegação por gestos e diferentes densidades de ecrã. A forma arredondada é a parte simples; os estados e as exceções dão trabalho.

Material Design, iOS e a tentativa de aproximar plataformas

Segundo o Sapo.pt, a reformulação aproxima visualmente o Android da experiência recente do WhatsApp no iPhone, sem copiar integralmente os efeitos visuais associados ao iOS. A distinção faz sentido: consistência entre plataformas não exige que os aplicativos sejam cópias pixel a pixel.

No Android, uma interface pode usar uma barra com cantos arredondados e ainda respeitar convenções do Material Design, como contraste legível, estados de seleção claros e feedback tátil ou visual previsível. No iOS, as mesmas decisões precisam conviver com padrões de navegação, tipografia e gestos próprios do sistema.

Para quem alterna entre dispositivos, alguma familiaridade reduz o custo de adaptação. Para quem implementa produtos multiplataforma, porém, há uma armadilha: tentar uniformizar tudo e acabar ignorando as expectativas nativas de cada sistema. Eu prefiro compartilhar a lógica de navegação e adaptar a apresentação, em vez de forçar uma única interface em todas as plataformas.

O que desenvolvedores podem aprender com esse redesenho

Essa mudança é um bom lembrete de que um componente de navegação não é só uma fileira de botões. Ele define o que está disponível, indica onde o utilizador se encontra e pode afetar a leitura do conteúdo principal. Uma alteração de forma pode exigir rever layout, animações, semântica e testes.

  • Reserve espaço para a navegação: se o conteúdo rolar por baixo da barra, aplique o inset ou padding correto para que a última mensagem não fique escondida.
  • Teste o teclado aberto: uma barra fixa pode ocupar espaço útil ou aparecer numa posição estranha quando o teclado é exibido.
  • Não dependa só da cor: o estado selecionado deve ser reconhecível por forma, ícone, texto ou outro sinal além de uma diferença subtil de cor.
  • Considere as áreas de toque: um controlo visual pequeno pode continuar a ter uma área interativa confortável, sem colidir com os controlos vizinhos.
  • Valide os dois temas: transparências, sombras e elevação podem perder definição em fundos claros ou escuros.

Também é uma boa oportunidade para rever instrumentação. Se a equipa acompanha tarefas concluídas, erros de navegação ou abandono de fluxos, uma mudança visual pode alterar esses indicadores. Comparar versões com testes controlados ajuda a distinguir preferência estética de melhoria real de usabilidade.

Na Prática: protótipo de uma barra inferior flutuante em Jetpack Compose

O exemplo abaixo mostra uma forma simples de prototipar o padrão em Android com Jetpack Compose. Ele cria uma barra centralizada, limita a largura máxima e mantém três opções selecionáveis. Não é código do WhatsApp nem reproduz a implementação interna da Meta; serve para testar o comportamento do padrão num projeto próprio.

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.selected
import androidx.compose.ui.unit.dp

@Composable
fun FloatingNavigationExample() {
    var selectedItem by remember { mutableIntStateOf(0) }
    val labels = listOf("Conversas", "Atualizações", "Chamadas")

    Scaffold(
        bottomBar = {
            Box(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(horizontal = 16.dp, vertical = 8.dp),
                contentAlignment = Alignment.Center
            ) {
                Surface(
                    modifier = Modifier
                        .fillMaxWidth()
                        .widthIn(max = 520.dp),
                    shape = RoundedCornerShape(28.dp),
                    tonalElevation = 3.dp,
                    shadowElevation = 6.dp,
                    color = MaterialTheme.colorScheme.surface
                ) {
                    Row(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(72.dp),
                        horizontalArrangement = Arrangement.SpaceEvenly,
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        labels.forEachIndexed { index, label ->
                            val isSelected = selectedItem == index

                            Text(
                                text = label,
                                modifier = Modifier
                                    .clickable(
                                        role = Role.Tab,
                                        onClick = { selectedItem = index }
                                    )
                                    .semantics {
                                        selected = isSelected
                                    }
                                    .padding(horizontal = 12.dp, vertical = 16.dp),
                                color = if (isSelected) {
                                    MaterialTheme.colorScheme.primary
                                } else {
                                    MaterialTheme.colorScheme.onSurfaceVariant
                                },
                                style = MaterialTheme.typography.labelLarge
                            )
                        }
                    }
                }
            }
        }
    ) { innerPadding ->
        Box(modifier = Modifier.padding(innerPadding)) {
            // Conteúdo da tela. A navegação é fornecida pelo Scaffold.
        }
    }
}

O limite de largura evita que a barra fique exageradamente comprida num tablet ou numa janela redimensionada. As margens criam o efeito destacado, enquanto o Scaffold ajuda a organizar o espaço da tela. Num produto real, eu substituiria os rótulos isolados por itens com ícones e texto, verificaria o tamanho das áreas clicáveis e testaria leitores de ecrã.

Erros comuns ao implementar navegação flutuante

  • Confundir decoração com arquitetura: arredondar a barra sem rever o espaço do conteúdo pode esconder a última linha ou botão da tela.
  • Usar transparência só porque está na moda: um fundo translúcido pode prejudicar o contraste quando o conteúdo atrás muda. Use-o apenas se a legibilidade continuar previsível.
  • Esquecer os insets do sistema: gestos, barras do sistema e recortes de ecrã variam. Teste em dispositivos reais ou emuladores com configurações diferentes.
  • Reduzir a área de toque para preservar o visual: o elemento pode parecer compacto, mas os alvos interativos precisam continuar confortáveis e independentes.
  • Aplicar o mesmo layout a qualquer largura: em ecrãs grandes, uma barra inferior centralizada pode não ser a melhor solução. Uma navegação lateral pode aproveitar melhor o espaço.
  • Testar apenas no tema claro: sombras discretas podem desaparecer no modo escuro, enquanto fundos claros podem reduzir a separação entre barra e conteúdo.

Uma boa comparação não se limita ao iOS. Vale observar padrões usados por outros aplicativos, como a navegação inferior tradicional do próprio Material Design e as escolhas de apps como Telegram e Signal. O objetivo não é copiar concorrentes, mas perceber como cada solução equilibra acesso rápido, densidade de informação e espaço de leitura.

FAQ sobre a nova interface do WhatsApp para Android

A barra flutuante já está disponível para todos?

Não há confirmação disso na informação publicada. O recurso foi identificado numa versão beta e ainda não estava acessível a todos os participantes dos testes. A distribuição pode acontecer gradualmente ou sofrer alterações.

A mudança altera as funções do WhatsApp?

O que foi descrito é principalmente uma reformulação visual da navegação inferior. Os atalhos continuam associados a áreas como conversas, atualizações e chamadas; não há indicação, na fonte, de uma mudança funcional equivalente.

O WhatsApp para Android vai copiar a interface do iPhone?

A proposta aproxima a linguagem visual, mas não implica uma cópia integral. O Android deve continuar a respeitar as convenções e os requisitos de legibilidade associados ao seu ecossistema.

Como posso testar esse padrão no meu aplicativo Android?

Um protótipo em Jetpack Compose permite validar rapidamente forma, espaçamento e seleção. Depois, teste com conteúdo longo, modo escuro, fontes ampliadas, teclado aberto, leitores de ecrã e diferentes larguras de janela.

O que observar quando a atualização chegar

Eu acompanharia três pontos: se a barra realmente aumenta a área útil de leitura, se os atalhos continuam fáceis de alcançar e se a interface mantém contraste e previsibilidade em condições menos ideais. Uma aparência moderna é um bom começo, mas não substitui testes de usabilidade.

Para quem desenvolve, a lição é prática: componentes pequenos também carregam decisões de produto. Uma barra inferior pode parecer apenas um detalhe visual, mas influencia navegação, acessibilidade, responsividade e percepção de qualidade. O melhor redesenho é aquele que melhora essas dimensões sem criar novos obstáculos.

Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto.

Y

Yuri Sousa

Front-End Developer / Designer

Desenvolvedor apaixonado por criar experiências digitais acessíveis e visualmente perfeitas. Escrevo sobre desenvolvimento web, design e tecnologia.