Header Ads

Modo de Janela de Freeform do Android Nougat: o que é e como os desenvolvedores podem usá-lo

Quando o Android 7.0 Nougat foi anunciado pela primeira vez no início de 2016, ele trouxe com ele um recurso muito solicitado para a plataforma Android - suporte multi-janela. A maioria das pessoas está ciente do suporte a multi-janelas com tela dividida ativado por padrão em todos os celulares e tablets do Android Nougat. Os dispositivos Android TV com Android Nougat vêm com suporte para suporte de multi-janelas de imagem em imagem.
No entanto, há um terceiro modo multi-janela presente no Android Nougat que não muitas pessoas estão cientes de: modo de janela de forma livre. Este modo permite ao Android apresentar aplicativos como janelas flutuantes que podem ser movidas e redimensionadas à vontade pelo usuário. É essencialmente a implementação do Android de um gerenciador de janelas de empilhamento.

Na documentação do SDK do Android, afirma que:
Os fabricantes de dispositivos maiores podem optar por ativar o modo de forma livre, no qual o usuário pode redimensionar livremente cada atividade. Se o fabricante habilitar esse recurso, o dispositivo oferece modo de forma livre, além do modo de tela dividida.

E também, no Android 7.0 CDD:
Implementações de dispositivos com tamanho de tela xlarge DEVE apoiar o modo de forma livre.

 Isso indica que qualquer novo dispositivo Android de tela grande que acompanha o Android 7.0 poderia ter o modo de janela livre habilitado pelo fabricante.

No entanto, esta não é absolutamente uma exigência difícil. É possível forçar qualquer dispositivo Android Nougat (com as opções de desenvolvedor habilitado) para oferecer suporte ao modo de janela de forma livre usando um dos dois métodos diferentes:

Ativando o modo de janela de forma livre em qualquer dispositivo Android Nougat

Método 1 (um computador com adb é necessário)

Verifique se a Depuração USB está ativada nas Opções do desenvolvedor. Em seguida, conecte o dispositivo a um computador com o adb instalado e execute o seguinte comando:

"adb shell settings put global enable_freeform_support 1"

Método 2 (sem requisitos adicionais) 

Ative a opção "Forçar atividades a serem redimensionáveis" na parte inferior das Opções do desenvolvedor.
Ambos os métodos requerem a interface de utilizador do sistema para ser reiniciado antes que possam ter efeito. A maneira mais fácil de fazer isso é reiniciar o dispositivo (ou, se o dispositivo estiver enraizado, você pode simplesmente matar o processo com.android.systemui)

OK, então modo de forma livre está ativado ... agora o quê?

Se você ativou o modo de forma livre usando o Método 1, então haverá um novo botão nas entradas do aplicativo no menu Visão geral para iniciar um aplicativo no modo de janela de forma livre.
No Método 2, no entanto, não é possível lançar um aplicativo no modo de forma livre através do próprio Android. Felizmente, é possível que qualquer lançador de terceiros lance um aplicativo no modo de janela de forma livre usando APIs padrão do Android que foram finalizadas como parte do nível 24 da API.
A chave para o lançamento de um aplicativo no modo de forma livre é chamar o método ActivityOptions.setLaunchBounds (). Este método leva um Rect como um argumento, contendo os limites de janela que o aplicativo será lançado com.
Você pode então iniciar o aplicativo com startActivity (Intent, Bundle). Se você ainda não tiver um pacote ActivityOptions, crie um com ActivityOptions.makeBasic () e, em seguida, chamando setLaunchBounds () no bundle recém-criado.
Observe que, por padrão, se já houver uma tarefa para o aplicativo na tela Visão geral, o Android simplesmente redirecionará para a tarefa existente (tela cheia) que foi lançada anteriormente pelo usuário. Você precisará limpar todas as tarefas do aplicativo na Visão Geral antes de tentar iniciar o aplicativo em uma janela de formulário livre. (Para aplicativos com atividades que são iniciadas nos modos padrão ou singleTop, você pode forçar uma nova janela para abrir, adicionando o:
Intent.FLAG_ACTIVITY_MULTIPLE_TASK sinalizador para a intenção antes de chamar startActivity ().)

Como funciona o modo freeform sob o capô?

Existe um excelente artigo escrito que explica como o modo multi-janela, incluindo o modo de forma livre, é implementado no Android Nougat. (NOTA: o artigo está escrito em chinês, por isso certifique-se de executá-lo através do Google Translate)
Em poucas palavras, os aplicativos no modo freeform são executados em uma pilha separada do resto do sistema (pense: desktop virtual). Portanto, não é possível que aplicativos de forma livre sejam executados em cima do lançador ou em cima de outro aplicativo em tela cheia.
As aplicações em execução no modo de forma livre (que não têm o android: windowIsFloating definido como verdadeiro) têm um DecorCaptionView adicionado como uma criança do DecorView de nível superior. Essa exibição contém um LinearLayout definindo a barra de legenda da janela para mover, maximizar e fechar a janela. Embora eu não recomendá-lo pessoalmente, é possível acessar e personalizar essa exibição, obtendo o DecorView usando Window.getDecorView (), moldando-o para um ViewGroup e, em seguida, acessando suas exibições filho.
Qualquer aplicativo que seja projetado para se comportar bem no modo de multi-janelas de tela dividida padrão do Android funcionará no modo de forma livre. IsInMultiWindowMode () retornará true para aplicativos em execução no modo freeform. Existem algumas outras classes disponíveis publicamente e métodos que um aplicativo pode usar que se relacionam especificamente com o modo de forma livre:
  • Window.setDecorCaptionShade (): este método pode ser usado para substituir a sombra dos controles de legenda (o botão maximizar e fechar) para aplicativos no modo de forma livre.
  • Window.setRestrictedCaptionAreaListener (): isso pode ser usado para detectar quando uma janela é movimentada no modo freeform. O Window.OnRectrictedCaptionAreaChangedListener é chamado sempre que a posição dos controles de legenda é alterada (quando um usuário move a janela ao redor) e fornece um Rect com os novos limites dos controles de legenda.
  • ActivityInfo.WindowLayout: essa classe contém informações declaradas no manifesto do aplicativo como o posicionamento inicial de uma janela de formulário livre que um aplicativo pode solicitar no lançamento. Por exemplo, você pode listar o seguinte na tag <activity> do seu manifesto:
<layout
    android:defaultHeight="640dp"
    android:defaultWidth="360dp"
    android:gravity="center" />
 
Em seguida, quando o dispositivo já está no modo de forma livre e o aplicativo é 
iniciado, ele será iniciado com esses limites especificados.

Exemplos de modo de janela de forma livre em ação

No verão de 2016, enquanto o Android Nougat ainda era uma visualização de desenvolvedor, eu lancei um aplicativo chamado Taskbar que fornece um menu de início do Windows e lista de aplicativos recentes em uma sobreposição de sistema. Ele permite que os usuários no Nougat para lançar aplicativos no modo de janela de forma livre - e, uma vez que a barra de tarefas usa uma sobreposição, ele pode permanecer na tela no ambiente de janela de forma livre. A combinação de Taskbar e modo de forma livre dá qualquer dispositivo Android, especialmente comprimidos, um PC-como sentir.
Você pode fazer o download da Barra de Tarefas no Google Play ou visualizar o código fonte no GitHub. Além dos conceitos mencionados neste artigo, eu também empregar alguns truques para manter o ambiente de modo de forma livre ativo, mesmo quando não freeform janelas são exibidas na tela. Os usuários também podem opcionalmente configurar a Barra de Tarefas como seu iniciador padrão para permitir que seu dispositivo inicialize automaticamente para o ambiente de modo de forma livre.
Como não há dispositivos que oficialmente são fornecidos com o suporte de janela de forma livre ativado pelo OEM (a partir desta redação), eu recomendo usar a barra de tarefas como uma ferramenta para os desenvolvedores testarem seus aplicativos no ambiente de janela de forma livre em dispositivos que não o suportam .
Além da barra de tarefas, também modifiquei o código fonte do Launcher3 do AOSP para permitir que ele inicie aplicativos no modo freeform. Este é um clone reto do Android 7.1.1 lançador de ações, com as mínimas modificações necessárias necessárias para permitir que ele acionar aplicativos de forma livre. Eu forneci este lançador modificado na esperança de que outros desenvolvedores irão implementar o suporte para o lançamento de janelas freeform em seus lançadores personalizados. Você pode ver o código fonte no GitHub, ou fazer o download de um exemplo de APK.
Minha esperança é que os desenvolvedores de lançadores personalizados possam utilizar esse código e permitir suporte para o lançamento de aplicativos de janela de forma livre para os usuários que desejam maior flexibilidade para o gerenciamento de janelas em seus dispositivos de grande tela.

No comments:

Powered by Blogger.