Antecipando o início de um curso avançado em desenvolvimento para Android, continuamos compartilhando com você uma série de traduções úteis.
Você está lendo o segundo artigo de uma série sobre gerenciamento de gestos. Você pode encontrar a primeira parte
aqui .
Na primeira parte da série, aprendemos como posicionar seu aplicativo “de ponta a ponta” da tela. Infelizmente, essa maneira de exibir pode levar ao fato de que algumas de suas visualizações estarão localizadas além das bordas na área dos painéis do sistema, escondendo-as do usuário. Neste artigo, descobriremos como adicionar uma
view
forma a não interromper a operação dos painéis do sistema.
Neste artigo, vou me referir a algo como "sistema de interface do usuário". Esse é o nome de qualquer uma das interfaces do sistema localizadas na tela, seja uma barra de navegação ou uma barra de status. Também inclui uma barra de notificação.
Inserções
O termo
inserção , por via de regra, causa medo entre os desenvolvedores do Android, já que em algum momento nos dias do Android Lollipop eles sempre tentavam usar a área de trabalho da barra de status. Por exemplo, essa pergunta antiga no
StackOverflow tem um número muito grande de visualizações.
As inserções mostram quais componentes da tela se cruzam com a interface do sistema, por exemplo, uma barra de navegação ou uma barra de status. A interseção pode simplesmente significar a exibição em cima do seu conteúdo, mas aqui você também pode obter informações sobre os gestos do sistema. Podemos usar a inserção para tentar resolver quaisquer conflitos, por exemplo, afastando a
view
das bordas.
No Android, as
inserções são representadas pela classe
WindowInsets e no AndroidX pela classe
WindowInsetsCompat . Começando com o Android Q, temos 5 tipos de
inserções que podemos usar ao criar telas de aplicativos. Qual tipo de
inset
usar depende da situação, então vamos ver cada tipo separadamente e ver.
Janela de sistema inserida
Método :
getSystemWindowInsets ()A inserção da janela do sistema é o tipo mais comum de
inset
atualmente. Eles existem com a API 1 de várias formas e aparecem na hierarquia de
view
sempre que a interface do usuário do sistema é exibida na parte superior do seu aplicativo (ao longo do eixo z). Exemplos comuns são a barra de status e a barra de navegação e, às vezes, o teclado na tela (IME).
Vejamos um exemplo em que você deve usar
inserções da janela do sistema . Já temos um
FloatingActionButton (FAB) , localizado no canto inferior da tela com um recuo de
16dp (de acordo com as
diretrizes ).
FAB em um aplicativo de E / S do Google antes de converter para borda a bordaDepois de seguir as etapas 1 e 2 do
artigo anterior , nossas
view
ficarão atrás da barra de navegação:
FAB no aplicativo de E / S do Google, depois de esticar para tela cheiaAgora você vê que sua agenda de conferências está localizada atrás da barra de navegação, e é exatamente isso que estamos buscando - criando uma experiência mais imersiva. Em mais detalhes sobre como trabalhar com listas / grades, consideraremos mais adiante.
Vamos voltar ao exemplo. Agora você vê que o FAB está oculto, e isso, por sua vez, significa que o usuário não poderá clicar nele. É esse conflito de exibição que queremos evitar. O exemplo parece mais claro quando usamos o botão de navegação (como na figura), pois o painel está localizado mais alto. Na navegação por gestos com adaptação dinâmica de cores, isso funcionará, mas lembre-se de que o sistema pode mudar para uma
tela translúcida a qualquer momento, o que pode atrapalhar a experiência de interação.
Agora é um bom momento para dizer o quanto é importante testar seu aplicativo em todos os modos de navegação.
Então, como lidamos com esse conflito visual? Nesse ponto, as
inserções da janela do sistema entram em jogo. Eles informarão onde os painéis do sistema estão localizados na hierarquia de
visualizações e você poderá usar esses valores para afastar a
visualização dos painéis do sistema.
No exemplo acima, o FAB está localizado próximo ao canto inferior direito, para que possamos usar os valores de
systemWindowInsets.bottom
e
systemWindowInsets.right
para aumentar o recuo da
view
em cada lado, a fim de afastá-la da barra de navegação.
Depois de fazer isso, obtemos o seguinte:
Falaremos sobre como isso é implementado um pouco mais tarde.TL DR:
As inserções da janela do sistema são mais adequadas para mover / recuar
views
interativas que não devem ser cobertas pelos painéis do sistema.
Inserções de elementos ajustáveis
Método :
getTappableElementInsets ()Mais abaixo na lista, temos
inserções de elementos tocáveis que acabaram de aparecer no Android Q. Elas são muito semelhantes às
inserções da janela do
sistema acima, no entanto, respondem à visibilidade variável da barra de navegação.
TL; DR: quanto às
tappable element insets
que podem ser
tappable element insets
: geralmente você pode ignorá-las e usar as
system window insets
. Você pode pular para a
seção Inserir gestos abaixo ou continuar lendo.
Inserções de elementos ajustáveis definem as
inserções mínimas que precisam ser aplicadas em uma exibição interativa (derivável). “Mínimo” neste caso significa que o valor aplicado ainda pode levar a um conflito com os painéis do sistema. É
isso que os distingue das
inserções da janela do
sistema , que sempre visam evitar conflitos com os painéis do sistema.
Vamos usar nosso exemplo com um
FloatingActionButton para mostrar a diferença de valores:
As bordas da barra de navegação são mostradas em rosa. Verde - bordas FAB com um recuo específico da margem inferior.
Lembre-se de que você nunca pode codificar valores da tabela acima, pois a barra de navegação pode ser redimensionada. Use
inserções para evitar conflitos.
Podemos ter notado que as
tappable element insets
e as
tappable element insets
system gesture insets
se comportam da mesma maneira quando o dispositivo está no modo de navegação de botão. Uma diferença importante fica visível quando o dispositivo usa o controle por gestos e a adaptação dinâmica de cores está ativada. Nesse caso, a barra de navegação é transparente, o que significa que é teoricamente possível organizar
views
interativas
views
, portanto o recuo da parte inferior é 0.
Apesar do fato de as
insets
não terem idéia de onde as visualizações devem ser localizadas, portanto, usando
inserções de elementos deriváveis na teoria, você pode obter algo semelhante:

Não funcionou perfeitamente, pois a
view
está muito próxima da barra de navegação, o que não será muito conveniente para o usuário.
Na prática, quase todos os casos de uso para
inserções de elementos tocáveis são melhor tratados com
inserções de janelas do sistema .
Inserções de gestos
Métodos :
getSystemGestureInsets () e
getMandatorySystemGestureInsets ()O próximo tipo de
insets
que veremos é a
gesture insets
, adicionada na versão do Android Q. Lembro que o Android Q introduz um novo modo de controle por gestos que permite ao usuário controlar o dispositivo usando dois gestos de toque, que podem ser executados da seguinte forma:
- Deslize horizontalmente a partir de uma das bordas da tela. Isso acionará a ação de retorno.
- Deslize para cima a partir da borda inferior da tela. Isso permitirá que o usuário vá para a tela inicial ou para os últimos aplicativos usados.
Demonstração de gestos no Android QAs inserções de gestos do sistema refletem áreas da janela em que os gestos do sistema têm precedência sobre os gestos de toque em seu aplicativo. Você deve ter notado que eu indiquei dois métodos acima. Isso se deve ao fato de que existem dois tipos de
inserções de gestos do
sistema : uma delas armazena todas as áreas de gestos e a segunda um subconjunto que contém as
inserções obrigatórias de
gestos do sistema .
Inserções de gesto do sistema
Para iniciantes, temos
inserções de gesto do sistema . Eles contêm todas as áreas na tela em que os gestos do sistema têm precedência sobre os gestos do seu aplicativo. No Android Q, isso significa que as
inserções terão algo parecido com isto, ou seja, conter recuo da borda inferior para que um gesto volte à tela inicial, recuos à esquerda e direita para um gesto para trás:
0 +--------------+ | | | System | 40 | Gesture | 40 | Insets | | | +--------------+ 60
Quando as
inserções de gesto do sistema serão úteis? Essas
insets
indicam onde os gestos do sistema têm precedência; portanto, você pode usá-los para mover proativamente quaisquer visualizações que exijam um gesto de furto.
Os exemplos incluem uma
tela que
se estende por baixo , furtos em jogos, carrosséis (como o
ViewPager ). Em geral, você pode usar essas
insets
para mover / recuar das bordas da tela.
Inserções obrigatórias de gestos no sistema
Inserções obrigatórias de
gestos do sistema são um subconjunto de
inserções de gestos do
sistema e contêm apenas áreas que não podem ser removidas do aplicativo (por exemplo, o nome). Observamos um pouco à frente no tópico do próximo artigo, onde falaremos sobre como lidar com conflitos de gestos, mas, para entender o artigo atual, basta saber que os aplicativos podem remover os gestos do sistema de algumas áreas da tela.
Inserções obrigatórias de
gestos do sistema indicam áreas da tela em que os gestos do sistema sempre têm precedência e são obrigatórios. No Android Q, a única área obrigatória no momento é a área de gesto da tela inicial na parte inferior da tela. Isso é necessário para que o usuário sempre possa sair do aplicativo.
Observando o exemplo de
inserções de
gesto em um dispositivo Android Q, você verá o seguinte:
0 0 +--------------+ +--------------+ | | | Mandatory | | System | | System | 40 | Gesture | 40 0 | Gesture | 0 | Insets | | Insets | | | | | +--------------+ +--------------+ 60 60
Pode-se observar que as
inserções de gesto do
sistema contêm recuos à esquerda, direita e inferior, enquanto as necessárias contêm apenas recuo da parte inferior, para que o gesto de retorno à tela inicial funcione normalmente. Falaremos mais sobre como excluir áreas de gestos no próximo artigo.
Inserções estáveis
Método :
getStableInsets ()Inserções estáveis são o último tipo de
inserção disponível no Android. Eles não são particularmente importantes para gerenciar gestos, mas eu decidi que valia a pena falar.
Inserções estáveis referem-se às
inserções da janela do sistema , mas indicam onde a interface do sistema pode ser exibida na parte superior do aplicativo e não onde é exibida em princípio.
As inserções estáveis são usadas principalmente quando a interface do sistema é configurada de forma que sua visibilidade possa ser ativada ou desativada, por exemplo, ao usar os modos
imerso para
trás ou
imersivo (por exemplo, jogos, visualização de fotos e players de vídeo).
Manipulação de inserções
Espero que você compreenda melhor quais são os vários tipos de
inserções , agora vamos ver como você pode usá-las em seus aplicativos.
O principal método para acessar o
WindowInsets é o método
setOnApplyWindowInsetsListener . Vejamos uma
view
exemplo, na qual queremos recuar para que não apareça atrás da barra de navegação:
ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> v.updatePadding(bottom = insets.systemWindowInsets.bottom)
Aqui, simplesmente definimos o recuo inferior da
view
como o valor do recuo inferior da
inserção da janela do
sistema .
Nota : Se você fizer isso em um ViewGroup , provavelmente desejará definir android:clipToPadding="false"
. Isso se deve ao fato de que todos os tipos de desenho de clipe são recuados por padrão. Esse atributo é comumente usado com o RecyclerView , que discutiremos em mais detalhes no próximo artigo.
Verifique se a sua função de escuta é idempotente. Se for chamado várias vezes com as mesmas inserções, o resultado deverá ser idêntico a cada vez. Um exemplo de uma função não idempotente é dado abaixo:
ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets -> v.updatePadding(bottom = v.paddingBottom + insets.systemWindowInsets.bottom) insets }
Não deveria ter aumentado (ala + =) no recuo da visualização toda vez que a função de escuta é chamada. As
inserções de janela podem acontecer a qualquer momento e várias vezes durante a vida útil da hierarquia de
visualizações .
Jetpack
Outra coisa que recomendo
ter em mente sobre
inserções é o uso da classe
WindowInsetsCompat do
Jetpack , independentemente da sua versão mínima do SDK. A API WindowInsets foi aprimorada e expandida ao longo dos anos, e a versão compat fornece consistência e comportamento da API em todos os níveis da API.
Onde os novos tipos de
inserções disponíveis no Android Q são
afetados , o método
compat é um conjunto de valores válidos para o dispositivo host em todos os níveis da API. Para acessar as novas APIs no
Android X, atualize-o para
androidx.core:core:1.2.0-xxx
(agora em alfa) ou superior.
Aqui você pode encontrar a versão mais recente.
Vamos ainda mais longe
Os métodos mencionados acima são a maneira mais fácil de usar a API WindowInsets [Compat], mas eles podem tornar seu código muito longo e padronizar. Anteriormente, escrevi um artigo no qual descrevi detalhadamente métodos que podem aumentar drasticamente a ergonomia do processamento de inserções de janelas usando ligadores de adaptadores. Você pode ler aqui.
No próximo artigo, aprenderemos como lidar com quaisquer conflitos que possam surgir entre os gestos de seus aplicativos e os gestos do sistema.
Só isso. Estamos aguardando todos no seminário on-line gratuito , no qual nosso especialista falará em detalhes sobre o curso .