Fontes para download para Android

Explorando fontes de download usando a biblioteca de suporte e Android Studio

Recentemente tive o prazer de usar o recém-suportado recurso de fontes de download que foi introduzido com Android Oreo, ao mudar a fonte de Winnie de Roboto para Lato.

Além das fontes em XML , a Support Library 26 apresentou o suporte para fontes de download, com compatibilidade para trás até a API 14. Historicamente, usar fontes personalizadas normalmente exigiu o uso de bibliotecas de terceiros, por isso foi bom ver mais suporte da estrutura do Android em si.

Roboto para a esquerda, Lato para a direita.

O que é Downloadable Fonts, e por que usá-lo?

Fontes de download permitem a capacidade de aplicativos para solicitar fontes de um aplicativo provedor de fontes em vez de incluir arquivos de fonte no apk ou baixá-lo. Um aplicativo de fornecedor de fontes recupera fontes e as armazena em cache localmente para que outros aplicativos possam solicitar e compartilhar fontes. Quão legal é isso!

Crédito da imagem: https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts.html

O Google Play Services (em dispositivos com versão 11+) é um desses fornecedores de fontes, que eu usei para o Lato, pois é uma Fonte do Google . Ainda não há documentação sobre como implementar seu próprio provedor de fontes se você usasse uma fonte personalizada não disponível no Google Play Services, no entanto, você pode usar fontes em XML, o que ainda é uma melhoria em relação ao que costumava ser!

Como você pode ver na imagem acima, os aplicativos que usam fontes de download fazem um FontRequest usando a API FontsContract que recupera o Typeface do Font Provider. O Provedor de Fontes não precisa baixar fontes se já existir no cache de Fontes.

Os desenvolvedores não precisam usar essas APIs diretamente se usando fontes de download através de XML, que é descrito mais na próxima seção.

Vantagens de usar fontes de download:

  • Tamanho reduzido do APK – o que pode impactar significativamente suas instalações de aplicativos !
  • Uma vez que os aplicativos podem compartilhar fontes do mesmo fornecedor, isso resulta em menos uso de memória preciosa, espaço em disco e dados celulares. Você pode imaginar quantos arquivos de fontes Roboto estão no armazenamento do seu telefone agora? ? (sim há aplicativos que os possuem em seus APKs).

Ótimo, vamos começar!

Existem três maneiras de implementar fontes de download em sua aplicação – usando os serviços do Android Studio e do Google Play, programaticamente ou através da Biblioteca de Suporte . Usei o Android Studio para gerar os arquivos necessários e usei o recurso Fontes em XML da biblioteca de Suporte para aplicar as fontes baixadas.

Eu decidi fazê-lo via XML porque, em seguida, você pode declarar as fontes necessárias no arquivo de manifesto do seu aplicativo, o que permite que a estrutura faça o download antecipadamente . Se o fizer programaticamente, você só pode solicitar fontes após o lançamento do aplicativo, o que pode causar um atraso no primeiro tempo de layout. Além disso, é menos trabalho fazê-lo via XML!

1. Se você deseja usar o Android Studio para gerar os arquivos necessários, então você precisará da versão 3.0+. Adicione o seguinte (versão 26+) ao build.gradle do seu módulo:

 implementação "com.android.support:support-compat:27.0.2"

2. Selecione uma exibição de texto em seu aplicativo para o qual deseja aplicar a fonte e clique no atributo fontFamily em Atributos no layout gráfico.

Selecione “Mais fontes …” na parte inferior, que abrirá a caixa de diálogo abaixo.

3. Certifique-se de ter “Criar fonte para download” selecionada. Isso resulta em três arquivos sendo baixados – lato.xml, font_certs.xml e preloaded_fonts.xml.

lato.xml
Este arquivo contém os atributos de fonte para carregar um tipo de letra do aplicativo de fonte de fontes do Google.

 <? xml version = "1.0" codificação = "utf-8"?> 
 <font-family xmlns: app = "http://schemas.android.com/apk/res-auto" 
 app: fontProviderAuthority = "com.google.android.gms.fonts" 
 app: fontProviderPackage = "com.google.android.gms" 
 app: fontProviderQuery = "Lato" 
 app: fontProviderCerts = "@ array / com_google_android_gms_fonts_certs"> 
 </ font-family>

font_certs.xml
O sistema usa esses certificados para verificar a identidade do provedor de fontes, para evitar a obtenção de fontes de uma fonte desconhecida. Se estiver usando as etapas acima, o Android Studio deve ter gerado automaticamente os certificados de string para dev e prod em font_certs.xml abaixo.

 <? xml version = "1.0" codificação = "utf-8"?> 
 <recursos> 
 <array name = "com_google_android_gms_fonts_certs"> 
 <item> @ array / com_google_android_gms_fonts_certs_dev </ item> 
 <item> @ array / com_google_android_gms_fonts_certs_prod </ item> 
 </ array> 
 <string-array name = "com_google_android_gms_fonts_certs_dev"> 
 <item> 
 <! - string cert -> 
 </ item> 
 </ string-array> 
 <string-array name = "com_google_android_gms_fonts_certs_prod"> 
 <item> 
 <! - string cert -> 
 </ item> 
 </ string-array> 
 </ resources>

preloaded-fonts.xml
Este arquivo é referenciado no manifesto do Android que ajuda o framework a pré-carregar fontes para evitar atrasos quando o aplicativo é iniciado.

 <? xml version = "1.0" codificação = "utf-8"?> 
 <recursos> 
 <array name = "preloaded_fonts" traduzível = "falso"> 
 <item> @ font / lato </ item> 
 <item> @ font / lato_bold </ item> 
 </ array> 
 </ resources>

4. Certifique-se de que esta linha seja adicionada ao arquivo Manifest da sua aplicação, o Android Studio deveria ter feito isso automaticamente:

 <meta-data 
 android: name = "preloaded_fonts" 
 android: resource = "@ array / preloaded_fonts" />

5. Ótimo, agora você está pronto para aplicar as fontes em XML!

 <style name = "AppTheme" parent = "Theme.AppCompat.Light.NoActionBar"> 
 <item name = "colorPrimary"> @ color / colorPrimary </ item> 
 ... 
 <item name = "android: fontFamily"> @ font / lato </ item> 
 </ style>

Tudo o que eu tinha que fazer era definir a família de fontes no tema do aplicativo para obter TextViews em todo o aplicativo para mudar para Lato, incluindo partes que estavam em negrito ou em itálico. No entanto, se você quiser configurar os pesos, você pode seguir os mesmos passos para obter o Lato Bold usando o Android Studio e trocar o peso manualmente em lato_bold.xml que você pode aplicar nos layouts XML:

 app: fontProviderQuery = "name = Lato & amp; weight = 700" // pode modificar o peso aqui

O todo parecia mágico! Mas….

Gotchas

Ao usar a Biblioteca de Suporte 26, percebi que as barras de ferramentas em todo o aplicativo ainda estavam em Roboto, resultando em uma robusta combinação de Roboto-Lato! Mesmo configurando explicitamente a fonteFamília da barra de ferramentas em XML não funcionou. Isso ocorre porque a barra de ferramentas não implementa a propriedade fontFamily , como faz um TextView.

Incluindo a fonteFamily em um estilo XML e definindo para ser o aplicativo da barra de ferramentas: titleTextAppearance funcionou – os títulos da barra de ferramentas estavam agora em Lato! Uma boa notícia é que isso parece ser corrigido na Biblioteca de Suporte 27 , então essa solução não deve ser necessária.

Havia alguns outros lugares onde Lato não se aplicava – um onde eu estava criando dinamicamente visões de texto com estilo arrojado e a visão de navegação inferior para a qual usei uma biblioteca de terceiros. Inicialmente pensei que isso faria o truque:

 val typeface = ResourcesCompat. getFont (isto, R.font. lato )
 // para a visão de navegação inferior de terceiros 
 bottomNavigationView.setDefaultTypeface (tipoface)
 // para a visualização de texto em negrito 
 textView.setTypeface (textView.getTypeface (), Typeface. BOLD )

Utilizei o método ResourcesCompat.getFont () para carregar o tipo de letra e configurá-lo em ambas as visualizações, e voilà, não havia mais Roboto! No entanto, em um ponto eu vi uma exceção ResourceNotFound ao definir o Typeface para o BottomNavigation usando este método.

Essencialmente, se a fonte não foi carregada pelo tempo em que este método é chamado ou o usuário não possui a versão necessária dos Serviços do Google Play, ele lançará essa exceção. A maneira mais segura de evitar isso é carregar a fonte de maneira programática, se você não conseguir definir o estilo através de XML. Aqui está a documentação oficial sobre como fazer isso.

Há também esse acidente com FontsContractCompat em 27.0.2, foi corrigido para uma versão futura da biblioteca de suporte e não parece ser um problema em 26.1.0

Outros requisitos e limitações a destacar:

  • Seu compileSDK deve ser pelo menos SDK 26, e se você quiser usar o Android Studio para gerar os arquivos de fonte, ele deve ser a versão 3.0+ . Se programaticamente ou usando Fontes em XML para aplicar fontes disponíveis, você deve usar pelo menos Support Library 26.
  • Usando o Google Play Services Como um provedor de fontes funciona em dispositivos que possuem a versão 11 e acima, caso contrário, ele usa a fonte padrão do sistema.
  • Como mencionado anteriormente, talvez você não consiga usar fontes de download se você estiver usando uma fonte personalizada que não esteja disponível no Google Play Services. Talvez você precise escrever seu próprio FontProvider personalizado neste caso, que ainda não possui documentação.

Eu (surpreendentemente) gostava de fazer a transição do nosso aplicativo de Roboto para Lato graças a Fontes em fontes XML e Downloadable, espero que você aproveite esses recursos também! Eu adoraria saber de você nos comentários ou no Twitter , e não esqueça de ? a postagem :).