O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Navegação por gestos

A partir do Android 10 (nível de API 29), o sistema Android oferece suporte completo à navegação com base em gestos. Há dois itens que os desenvolvedores precisam fazer para garantir que os aplicativos sejam compatíveis com esse recurso:

  • Estender o conteúdo do aplicativo de ponta a ponta.
  • Gerenciar gestos conflitantes do aplicativo.

Conteúdo do aplicativo de ponta a ponta

Para aproveitar o espaço adicional na tela disponibilizado pela barra de navegação flutuante, você precisará fazer algumas alterações no seu aplicativo.

Configuração de barras do sistema transparentes

Para fazer isso, defina os valores a seguir no seu tema:

<!-- values-29/themes.xml: -->

<style name="AppTheme" parent="...">
    <item name="android:navigationBarColor">@android:color/transparent</item>

    <!-- Optional, but recommended for full edge-to-edge rendering -->
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>
Barra de navegação transparente com botões ativados.

Também é possível fazer isso de forma dinâmica. Para isso, use Window.setNavigationBarColor() e Window.setStatusBarColor().

Quando o dispositivo está definido para usar a navegação por gestos e você faz com que o segundo plano da barra de navegação do aplicativo fique transparente, o sistema atualiza automaticamente a cor da alça com base na cor do conteúdo por trás dela. No entanto, quando o usuário está no modo de navegação de dois ou três botões, esses botões não mudam de cor. Em vez disso, o sistema aplica um segundo plano translúcido para que os botões fiquem visíveis. No entanto, o sistema só poderá fazer isso se o aplicativo for direcionado à API de nível 29 ou superior.

Configuração da IU de sinalização da visibilidade

Para poder exibir a visualização de ponta a ponta, o aplicativo precisa informar ao sistema que é capaz de gerenciar essa visualização. Para fazer isso, use View.setSystemUiVisibility() para definir os sinalizadores a seguir:

Kotlin

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)

Java

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

Juntos, esses sinalizadores informam ao sistema que o aplicativo precisa ser exibido em tela cheia, como se não houvesse barras de status e de navegação. Para eventos adicionais em tela cheia, você também pode definir SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN, que permite a retração da barra de status.

Se você estiver usando uma classe de visualização como CoordinatorLayout ou DrawerLayout, que lida automaticamente com a barra de status, os sinalizadores SYSTEM_UI_FLAG_LAYOUT_STABLE e SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN já podem estar definidos. Além disso, caso esteja usando setSystemUiVisibility() para definir outros sinalizadores, como SYSTEM_UI_FLAG_IMMERSIVE, tome cuidado para que esses outros sinalizadores não substituam os referenciados acima.

Mesmo que o aplicativo use uma visualização de ponta a ponta, o sistema ainda usará a API WindowInsets para indicar onde estão as barras do sistema.

Consumo manual de encartes

Caso seu aplicativo use uma hierarquia de visualização personalizada, pode ser que você precise consumir os encartes da janela do sistema manualmente. Normalmente, isso é feito por meio da implementação de uma interface OnApplyWindowInsetsListener:

Kotlin

view.setOnApplyWindowInsetsListener() {v, insets ->
    insets.consumeSystemWindowInsets()

Java

view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
    @Override
    public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
        // 1. Move views on top edge down by insets.getSystemWindowInsetTop()
        // 2. Move views on bottom edge up by insets.getSystemWindowInsetBottom()
        // 3. Also check getSystemWindowInsetLeft/Right(), such as for landscape
        // orientations
        return insets.consumeSystemWindowInsets();
    }
});

WindowInsets fornece encartes visuais comuns para todas as barras do sistema por meio de getSystemWindowInsets(). Além disso, Android 10 adiciona os seguintes métodos a WindowInsets:

Processamento de gestos conflitantes do aplicativo

O modelo de navegação por gestos pode entrar em conflito com gestos usados anteriormente pelos desenvolvedores de aplicativos. Por isso, pode ser necessário fazer ajustes na interface do usuário do aplicativo.

Conflitos com gestos Voltar

O novo gesto do sistema para Voltar é um deslizar em direção à borda esquerda ou direita da tela. Isso pode interferir com elementos de navegação de aplicativos nessas áreas. Para manter a funcionalidade dos elementos nas bordas esquerda e direita da tela, você precisará cancelar o gesto Voltar de forma seletiva, indicando ao sistema quais regiões precisam receber entrada por toque. Para fazer isso, passe um List<Rect> para a API View.setSystemGestureExclusionRects() introduzida em Android 10. Esse método também está disponível em ViewCompat a partir do androidx.core:core:1.1.0-dev01.

Por exemplo:

Kotlin

var exclusionRects = listOf(rect1, rect2, rect3)

fun onLayout(
        changedCanvas: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
  // Update rect bounds and the exclusionRects list
  setSystemGestureExclusionRects(exclusionRects)
}

fun onDraw(canvas: Canvas) {
  // Update rect bounds and the exclusionRects list
  setSystemGestureExclusionRects(exclusionRects)
}

Java

List<Rect> exclusionRects;

public void onLayout(
        boolean changedCanvas, int left, int top, int right, int bottom) {
    // Update rect bounds and the exclusionRects list
    setSystemGestureExclusionRects(exclusionRects);
}

public void onDraw(Canvas canvas) {
    // Update rect bounds and the exclusionRects list
    setSystemGestureExclusionRects(exclusionRects);
}

Conflitos com gestos referentes a Tela inicial/Alternância rápida

Os novos gestos do sistema para a Tela inicial e Alternância rápida envolvem deslizar até a parte inferior da tela, no espaço anteriormente ocupado pela barra de navegação. Diferentemente do que ocorre no caso do Voltar, os aplicativos não podem cancelar esses gestos.

Para reduzir esse problema, Android 10 introduza a API WindowInsets.getMandatorySystemGestureInsets(), que informa os limites de reconhecimento de toque aos aplicativos.

Jogos e outros aplicativos de não visualização

Jogos e outros aplicativos que não têm uma hierarquia de visualização geralmente exigem que o usuário deslize perto das áreas de gesto do sistema. Nesses casos, os jogos podem usar Window.setSystemGestureExclusionRects() para excluir áreas que se sobrepõem a regiões reservadas para os gestos do sistema. A exclusão dessas áreas precisa ser garantida somente quando for necessário, como durante o jogo em si.

Caso um jogo exija que o usuário deslize perto da área de gesto da tela inicial, o aplicativo pode solicitar a exibição em modo imersivo. Isso desativa os gestos do sistema enquanto o usuário estiver interagindo com o jogo, mas permite que o usuário os reative ao deslizar a partir da parte inferior da tela.

Recursos adicionais

Para saber mais sobre a navegação por gestos, consulte os recursos adicionais a seguir:

Postagens do blog

Vídeos