Como gerenciar janelas

O ChromeOS oferece suporte a apps Android em várias janelas. O sistema renderiza apps em contêineres de janela cujo tamanho é determinado pelo formato do dispositivo, como mostrado na Figura 1.

Figura 1. Uma janela de app em dispositivos diferentes.

É importante projetar layouts que funcionem com diferentes tamanhos de tela. Se você siga as diretrizes do Android para oferecer suporte a diferentes telas tamanhos, ele também funcionará bem quando executados no ChromeOS.

Esta página mostra como garantir que a janela do seu app seja aberta corretamente e seja redimensionada suavemente e exibe todo o conteúdo quando o tamanho muda.

Tamanho inicial de inicialização

Os apps podem solicitar o tamanho inicial de inicialização das seguintes maneiras:

  • Use um tamanho de inicialização somente em ambientes de área de trabalho. Isso ajuda o gerenciador de janelas a informar os limites e a orientação corretos. Para indicar uma preferência usada no modo de área de trabalho, adicione as seguintes metatags na <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Use limites de inicialização estáticos. Use <layout> dentro da entrada do manifesto do seu para especificar uma "fixação" tamanho inicial, como no exemplo a seguir:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • Use limites de inicialização dinâmicos. Uma atividade pode criar e usar ActivityOptions.setLaunchBounds(Rect) ao criar uma nova atividade. Ao especificar um retângulo vazio, seu app pode ser maximizado.
.

Redimensionar janelas

No ChromeOS, os usuários podem redimensionar a janela de um app da maneira normal: arrastando no canto inferior direito, como mostrado na Figura 2.

Figura 2. Uma janela de app redimensionável.

Há duas opções para lidar com o redimensionamento de janela ao usar o método Classe View:

  • Responder dinamicamente às mudanças de configuração chamando onConfigurationChanged(..): Por exemplo, é possível adicionar android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" ao manifesto da atividade. Para mais informações sobre como lidar com mudanças de configuração, leia Como processar mudanças de configuração.
  • Deixar o sistema reiniciar a atividade. Nesse caso, implemente onSaveInstanceState e usar a arquitetura do ViewModel componente para restaurar a configuração estado salvo.

Ao usar o Jetpack Compose, o comportamento de redimensionamento depende do como sua atividade é configurada. Se ele lidar com mudanças de forma dinâmica, um a recomposição é acionada quando o tamanho da janela muda. Se a atividade for reiniciada pelo sistema, uma composição inicial ocorre após a reinicialização. De qualquer é importante criar layouts do Compose que se adaptem a mudanças de janela. tamanhos. Não presuma tamanhos fixos.

Dimensões da janela

Faça com que suas atividades leiam as dimensões da janela sempre que iniciarem e organizar o conteúdo de acordo com a configuração atual.

Para determinar a configuração atual, chame getResources().getConfiguration() na atividade atual. Não use o campo configuração da atividade em segundo plano ou do recurso do sistema. A atividade em segundo plano não tem tamanho, e a configuração do sistema pode contêm várias janelas com tamanhos e orientações conflitantes, e os dados possam ser extraídos.

Os tamanhos da janela e da tela não são iguais. Para ver o tamanho da janela no DP, use Activity.getResources().getConfiguration().screenWidth e Activity.getResources().getConfiguration().screenHeight. Você provavelmente nunca precisará usar o tamanho da tela.

Limites de conteúdo

Os limites de conteúdo de uma janela podem mudar após o redimensionamento. Por exemplo, a área dentro da janela usada pelo app pode mudar se a janela ficar grande demais para caber na tela. Siga as seguintes diretrizes:

  • Os apps que usam o processo de layout do Android são automaticamente dispostos no espaço disponível.
  • Os apps nativos precisam ler a área disponível e monitorar as mudanças de tamanho para evitar com elementos de IU inacessíveis. Chame os métodos a seguir para determinar o tamanho inicial disponível para essa superfície:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    O monitoramento contínuo pode ser feito usando um observador:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • Adicionar um listener a view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    Se o app pré-dimensionar a arte, faça isso sempre que a resolução mudar.

Redimensionamento em formato livre

O ChromeOS permite que qualquer janela seja redimensionada livremente: o usuário pode mudar a largura, altura e posição na tela. Muitos apps para Android são criados sem o redimensionamento livre. Considere estes problemas:

  • A posição da tela pode mudar. Sempre use o sistema para realizar transformações de coordenadas de janela para tela e de tela para janela.
  • Se você estiver usando o sistema de visualização do Android, o layout da janela mudará automaticamente com uma mudança de tamanho.
  • Se você não usa o sistema de visualização e controla a superfície, o app precisa e processar mudanças de tamanho por conta própria.
  • Para apps nativos, use os participantes do mLastContent ou a visualização de conteúdo para determinar o tamanho inicial.
  • Quando o app estiver em execução, ouça onContentRectChangedNative ou onGlobalLayout para reagir às mudanças de tamanho.
  • Quando o tamanho do app mudar, redimensione ou recarregue os layouts e a arte e atualizar áreas de entrada.

Modo de tela cheia

O modo de tela cheia funciona da mesma forma que no Android. Caso a janela não esteja cobrindo a tela inteira, as solicitações de tela cheia (ocultando todos os elementos da interface do sistema) são ignorados. Quando o app for maximizado os métodos normais de tela cheia, layouts e funções serão executados. Isso ocultará os elementos da IU do sistema (barra de controle da janela e a estante).

Orientação da tela

A orientação mais comum de um app para Android é retrato, porque é assim que a maioria dos smartphones é usada. Embora a orientação retrato seja indicada para smartphones, não é adequada para laptops e tablets, em que é preferível a orientação paisagem. Para receber os melhores resultados para seu app, ofereça suporte para ambas as orientações.

Alguns apps Android presumem que, quando um dispositivo é mantido no modo retrato, a o valor de rotação é Surface.ROTATION_0: Isso é válido para a maioria dos dispositivos Android. No entanto, quando o app está em um alguns modo ARC, o valor de rotação para a orientação retrato pode não ser Surface.ROTATION_0

Para ter um valor de rotação preciso ao ler o acelerômetro ou sensores semelhantes, use o método Display.getRotation() e troque o eixo corretamente.

A atividade raiz e a orientação

Uma janela do Chromebook consiste em uma pilha de janelas de atividade. Todas as janelas da pilha têm o mesmo tamanho e orientação.

Mudanças repentinas de orientação e tamanho são confusas em um ambiente de área de trabalho. O gerenciador de janelas do Chromebook evita isso de maneira semelhante para o modo lado a lado do Android: a atividade na parte inferior dos controles de pilha os atributos de todas as atividades acima dela. Isso pode levar a situações inesperadas em que uma atividade recém-iniciada que é retrato e não redimensionável se torna paisagem. e redimensionável.

O modo do dispositivo tem efeito aqui: no modo tablet, a orientação não é bloqueada e cada janela preserva a própria orientação, como é normal no Android.

Diretrizes de orientação

Siga estas diretrizes para gerenciar a orientação:

  • Se você oferecer compatibilidade a apenas um modo, adicione as informações ao manifesto para que o gerenciador de janelas saiba disso antes de iniciar o aplicativo. Ao especificar a orientação, especifique também as orientações do sensor, quando possível. Os Chromebooks costumam ser conversíveis, e um app de cabeça para baixo é uma experiência ruim para o usuário.
  • Tente manter uma única orientação selecionada. Evite solicitar uma orientação no manifesto e definir outra programaticamente mais tarde.
  • Tenha cuidado ao mudar a orientação com base no tamanho da janela. O usuário pode receber em uma pequena janela retrato e não pode voltar a uma janela janela em modo paisagem.
  • Há controles de janela no Chrome para alternar entre todos os layouts disponíveis. Ao escolher a opção de orientação correta, você garante que o usuário tem o layout correto após iniciar o aplicativo. Se um app estiver disponível no modo retrato e paisagem, use o modo paisagem por padrão, se possível. Depois de definida, essa opção será memorizada em cada app.
  • Evite mudanças de orientação desnecessárias. Por exemplo, se a atividade a orientação é retrato, mas o app chama setRequestedOrientation(LANDSCAPE). durante a execução, isso causa redimensionamento desnecessário da janela, o que é irritante para o e pode reiniciar o app, mas ele não vai conseguir processar isso. É melhor definir a orientação uma vez, por exemplo, no manifesto e mudá-la se necessário.

Outras considerações

Estes são outros fatores a serem considerados ao trabalhar com apps Android em: ChromeOS:

  • Não chame finish() no método onDestroy da sua atividade. Isso faz com que o que o app feche após o redimensionamento e não seja reiniciado.
  • Não use tipos de janela incompatíveis, como TYPE_KEYGUARD e TYPE_APPLICATION_MEDIA.
  • Agilize as reinicializações de atividades armazenando objetos que foram alocados anteriormente.
  • Se você não quiser que o usuário redimensione seu app, especifique android:resizeableActivity=false no arquivo de manifesto.
  • Teste o app para garantir que ele processe corretamente as mudanças no tamanho da janela.