Android

23 mar, 2015

Suportando vários tamanhos e definições de telas no Android

Publicidade

É comum as pessoas se referirem aos vários tamanhos e definições de tela no Android como um gigantesco problema. Mas será tudo isso?

Desde a primeira versão do sistema, a plataforma já suportava o posicionamento dinâmico dos elementos, coisa que plataformas como iOS estão adotando só agora. O desenvolvedor Android sempre teve essa questão em mente. Mas será que isso é tão complicado como as pessoas dizem?

Fizemos um talk interno na Concrete Solutions para coletar experiências dos times sobre esse problema. Participaram tanto desenvolvedores (inclusive internacionais), quanto designers.

O primeiro ponto levantado foi nos atentar para a definição base do projeto: qual o formato e definição mais popular entre os dispositivos Android? Essa informação nem sempre é simples de ter, mas o panorama geral é disponibilizado no dashboard do Google. Atualmente temos:

Screenshot-from-2015-03-02-133455-300x181

Percebemos que há uma maior concentração para dispositivos hdpi (alta densidade de pixels independentes) com tela tamanho normal. Porém, mdpi (média densidade) ainda possui uma porcentagem representativa. Então, como atacar o problema?

Recomendamos sempre olhar para sua base de usuários para definir o baseline mas, de uma forma geral, por mais que o mdpi ainda seja representativo, gerar assets de hdpi para cima tem suas vantagens:

  • Assets serão automaticamente redimensionados para mdpis (ao custo de um pouco de processamento)
  • Seu APK (o arquivo executável da aplicação) terá um tamanho reduzido
  • Você ainda estará atingindo mais de 80% da base mundial de dispositivos

Assim, caso sua base de usuários não seja um caso muito particular e tendo em mente a abordagem mobile first, recomendamos começar o desenvolvimento pensando em emuladores com telas do tamanho normal e densidade alta (hdpi).

É importante dizer para o Google para quais tamanhos e densidades você está preparando sua aplicação. Fazemos isso no arquivo AndroidManifest.xml com a seguinte declaração (apenas um exemplo):

<compatible-screens>
    <screen android:screenDensity="hdpi" android:screenSize="small"/>
    <screen android:screenDensity="xhdpi" android:screenSize="small"/>
 
    <screen android:screenDensity="hdpi" android:screenSize="normal"/>
    <screen android:screenDensity="xhdpi" android:screenSize="normal"/>
    <screen android:screenDensity="480" android:screenSize="normal"/>
</compatible-screens>

Até aqui temos nosso alvo marcado e declarado. Não há mais nenhum truque?

Durante nosso talk falamos de outras maneiras de melhorar a performance de nossos aplicativos em várias telas. Por exemplo, usar imagens 9 patch. Este é um recurso antigo do Android, porém ninguém gostava de usar por acreditar que era muito complexo para gerar e manter estes 9 patches (eu, inclusive, estava nesse time de desenvolvedores). No entanto, algumas coisas mudaram no Android neste campo.

Welton Carvalho e Edouard Roussillon deram várias dicas de como criar e manter estes recursos. Uma delas é o 9 patches editor do Android Asset Studio. Outro editor é o da Web Look and Feel.

A vantagem de 9 patches é que eles escalam. O desenvolvedor ou designer define áreas do recurso que podem ser repetidas. Um botão, por exemplo, pode ter tudo que está entre as bordas repetido. Assim o recurso fica menor do que uma imagem para cada definição.

A alternativa a 9 patches é usar o esquema de recursos do Android mais a fundo. É possível fazer muita coisa usando apenas definições em xml. Por exemplo: sombras, botões com bordas arredondadas com gradientes de cores e etc. Com isso, você pode definir dimensões específicas para cada densidade e o recurso será altamente performático.

Por fim, ficou ressaltado que os desenvolvedores Android possuem diversos recursos para atacar esse problema. Nem sempre conhecemos todos e por isso a troca de experiências é importante. O Android Studio, por exemplo, possui integrado um editor de 9 patch (uma interface um pouco confusa, mas que pode ser útil), e o gradle nos permite limitar os recursos das dependências que queremos incluir. Exemplo:

android {
 
    defaultConfig {
    // exclui recursos de dependências de outras densidades que não as declaradas aqui
    resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
    }
}

Aqui na Concrete Solutions estamos sempre discutindo sobre qual a melhor forma de resolver problemas do desenvolvimento. Para o caso de várias telas e densidades, a conversa é constante, mas não acreditamos que nos complicamos muito por causa disso. Fiquem atentos que ainda vamos falar sobre como os desenvolvedores e UXers trabalham juntos para resolver estes detalhes.

Dúvidas e sugestões: deixem um comentário!