Compartilhar via


Criando recursos para telas variadas

O próprio Android é executado em muitos dispositivos diferentes, cada um com uma grande variedade de resoluções, tamanhos de tela e densidades de tela. O Android executará o dimensionamento e o redimensionamento para fazer seu aplicativo funcionar nesses dispositivos, mas isso pode resultar em uma experiência de usuário abaixo do ideal. Por exemplo, as imagens podem parecer desfocadas ou podem ser posicionadas conforme o esperado em uma exibição.

Conceitos

Alguns termos e conceitos são importantes de entender para suportar várias telas.

  • Tamanho da tela – A quantidade de espaço físico para exibir seu aplicativo

  • Densidade da tela – O número de pixels em uma determinada área na tela. A unidade de medida típica é pontos por polegada (dpi).

  • Resolução – O número total de pixels na tela. Ao desenvolver aplicativos, a resolução não é tão importante quanto o tamanho e a densidade da tela.

  • Pixel independente de densidade (dp) – Uma unidade de medida virtual para permitir que os layouts sejam projetados independentemente da densidade. Esta fórmula é usada para converter dp em pixels de tela:

    px = dp × dpi ÷ 160

  • Orientação – A orientação da tela é considerada paisagem quando ela é mais larga do que alta. Em contraste, a orientação retrato é quando a tela é mais alta do que larga. A orientação pode mudar durante a vida útil de um aplicativo à medida que o usuário gira o dispositivo.

Observe que os três primeiros desses conceitos estão inter-relacionados – aumentar a resolução sem aumentar a densidade aumentará o tamanho da tela. No entanto, se a densidade e a resolução forem aumentadas, o tamanho da tela poderá permanecer inalterado. Essa relação entre tamanho, densidade e resolução da tela complica o suporte à tela rapidamente.

Para ajudar a lidar com essa complexidade, a estrutura do Android prefere usar pixels independentes de densidade (dp) para layouts de tela. Usando pixels independentes de densidade, os elementos da interface do usuário aparecerão para o usuário como tendo o mesmo tamanho físico em telas com densidades diferentes.

Suporta vários tamanhos e densidades de tela

O Android lida com a maior parte do trabalho para renderizar os layouts corretamente para cada configuração de tela. No entanto, existem algumas ações que podem ser tomadas para ajudar o sistema.

O uso de pixels independentes de densidade em vez de pixels reais em layouts é suficiente na maioria dos casos para garantir a independência de densidade. O Android dimensionará os drawables em tempo de execução para o tamanho apropriado. No entanto, é possível que o dimensionamento faça com que os bitmaps pareçam borrados. Para contornar esse problema, forneça recursos alternativos para as diferentes densidades. Ao projetar dispositivos para várias resoluções e densidades de tela, será mais fácil começar com as imagens de maior resolução ou densidade e, em seguida, reduzir a escala.

Declarar o tamanho de tela suportado

Declarar o tamanho da tela garante que apenas dispositivos suportados possam baixar o aplicativo. Isso é feito definindo o elemento supports-screens no arquivo AndroidManifest.xml Esse elemento é usado para especificar quais tamanhos de tela são suportados pelo aplicativo. Uma determinada tela é considerada suportada se o aplicativo puder colocar corretamente seus layouts para preencher a tela. Usando esse elemento de manifesto, o aplicativo não aparecerá no Google Play para dispositivos que não atendem às especificações da tela. No entanto, o aplicativo ainda será executado em dispositivos com telas não suportadas, mas os layouts podem parecer borrados e pixelados.

As seis telas suportadas são declaradas no arquivo Properites/AndroidManifest.xml da solução:

Edite AndroidManifest.xml para incluir telas de suporte:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          android:versionCode="1"
          android:versionName="1.0"
          package="HelloWorld.HelloWorld">
      <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
      <supports-screens android:resizable="true"
                        android:smallScreens="true"
                        android:normalScreens="true"
                        android:largeScreens="true" />
      <application android:allowBackup="true"
                   android:icon="@mipmap/ic_launcher"
                   android:label="@string/app_name"
                   android:roundIcon="@mipmap/ic_launcher_round"
                   android:supportsRtl="true" android:theme="@style/AppTheme">
  </application>
</manifest>

Fornecer layouts alternativos para diferentes tamanhos de tela

Layouts alternativos tornam possível personalizar uma exibição para um tamanho de tela específico, alterando o posicionamento ou o tamanho dos elementos da interface do usuário do componente.

A partir do API Nível 13 (Android 3.2), os tamanhos de tela são preteridos em favor do uso do qualificador swNdp. Esse novo qualificador declara a quantidade de espaço que um determinado layout precisa. Recomenda-se que os aplicativos que devem ser executados no Android 3.2 ou superior usem esses qualificadores mais recentes.

Por exemplo, se um layout exigisse um mínimo de 700 dp de largura de tela, o layout alternativo iria em um layout de pasta-sw700dp:

Como diretriz, aqui estão alguns números para vários dispositivos:

  • Telefone típico – 320 dp: um telefone típico

  • Um tablet de 5" / dispositivo "tweener" – 480 dp: como o Samsung Note

  • Um tablet de 7" – 600 dp: como o Barnes & Noble Nook

  • Um tablet de 10" – 720 dp: como o Motorola Xoom

Para aplicativos que visam níveis de API até 12 (Android 3.1), os layouts devem ir em diretórios que usam os qualificadores small/normal/large/xlarge como generalizações dos vários tamanhos de tela disponíveis na maioria dos dispositivos. Por exemplo, na imagem abaixo, há recursos alternativos para os quatro tamanhos de tela diferentes:

A seguir está uma comparação de como os qualificadores de tamanho de tela pré-API Nível 13 mais antigos se comparam a pixels independentes de densidade:

  • 426 dp x 320 dp é pequeno

  • 470 dp x 320 dp é normal

  • 640 dp x 480 dp é grande

  • 960 dp x 720 dp é xlarge

Os qualificadores de tamanho de tela mais recentes no nível de API 13 e superior têm uma precedência maior do que os qualificadores de tela mais antigos dos níveis de API 12 e inferiores. Para aplicativos que abrangerão os níveis de API antigo e novo, pode ser necessário criar recursos alternativos usando ambos os conjuntos de qualificadores, conforme mostrado na captura de tela a seguir:

Fornecer bitmaps diferentes para diferentes densidades de tela

Embora o Android dimensione bitmaps conforme necessário para um dispositivo, os bitmaps em si podem não aumentar ou diminuir elegantemente: eles podem se tornar confusos ou borrados. Fornecer bitmaps apropriados para a densidade de tela atenuará esse problema.

Por exemplo, a imagem abaixo é um exemplo de problemas de layout e aparência que podem ocorrer quando recursos de especificação de densidade não são fornecidos.

Screenshots without density resources

Compare isso com um layout projetado com recursos específicos de densidade:

Screenshots with density-specific resources

Crie recursos de densidade variável com o Android Asset Studio

A criação desses bitmaps de várias densidades pode ser um pouco tediosa. Como tal, o Google criou um utilitário online que pode reduzir um pouco do tédio envolvido com a criação desses bitmaps chamado Android Asset Studio.

Android Asset Studio

Este site ajudará na criação de bitmaps que visam as quatro densidades de tela comuns, fornecendo uma imagem. O Android Asset Studio criará os bitmaps com algumas personalizações e, em seguida, permitirá que eles sejam baixados como um arquivo zip.

Dicas para várias telas

O Android é executado em um número desconcertante de dispositivos, e a combinação de tamanhos de tela e densidades de tela pode parecer esmagadora. As dicas a seguir podem ajudar a minimizar o esforço necessário para oferecer suporte a vários dispositivos:

  • Apenas projete e desenvolva para o que você precisa – Existem muitos dispositivos diferentes por aí, mas alguns existem em raros fatores de forma que podem exigir um esforço significativo para projetar e desenvolver. O painel Tamanho e densidade da tela é uma página fornecida pelo Google que fornece dados sobre o detalhamento da matriz de tamanho e densidade da tela. Esse detalhamento fornece informações sobre como desenvolver esforços em telas de suporte.

  • Use DPs em vez de Pixels - Os pixels se tornam problemáticos à medida que a densidade da tela muda. Não codifice valores de pixel. Evite pixels em favor de dp (pixels independentes de densidade).

  • Eviteo AbsoluteLayoutsempre que possível – ele foi preterido no nível 3 da API (Android 1.5) e resultará em layouts quebradiços. Não deve ser usado. Em vez disso, tente usar widgets de layout mais flexíveis, como LinearLayout, RelativeLayout ou o novo GridLayout.

  • Escolha uma orientação de layout como padrão – Por exemplo, em vez de fornecer os recursos alternativos layout-land e layout-port, coloque os recursos para paisagem no layout e os recursos para retrato no layout-port.

  • Use LayoutParams for Height and Width - Ao definir elementos da interface do usuário em um arquivo de layout XML, um aplicativo Android usando os valores wrap_content e fill_parent terá mais sucesso para garantir uma aparência adequada em diferentes dispositivos do que usando unidades independentes de pixel ou densidade. Esses valores de dimensão fazem com que o Android dimensione recursos de bitmap conforme apropriado. Por esse mesmo motivo, as unidades independentes de densidade são melhor reservadas para ao especificar as margens e o preenchimento dos elementos da interface do usuário.

Testando várias telas

Um aplicativo Android deve ser testado em relação a todas as configurações que serão suportadas. Idealmente, os dispositivos devem ser testados nos próprios dispositivos, mas em muitos casos isso não é possível ou prático. Nesse caso, o uso do emulador e da configuração de dispositivos virtuais Android para cada configuração de dispositivo será útil.

O SDK do Android fornece algumas capas de emulador que podem ser usadas para criar AVDs que replicarão o tamanho, a densidade e a resolução de muitos dispositivos. Muitos dos fornecedores de hardware também fornecem capas para seus dispositivos.

Outra opção é usar os serviços de um serviço de teste de terceiros. Esses serviços pegarão um APK, o executarão em muitos dispositivos diferentes e, em seguida, fornecerão comentários sobre como o aplicativo funcionou.