Typeface — é uma classe do SDK Android do pacote android.graphics que representa um tipo de fonte e é usada para personalização de texto em TextView e outros componentes de UI. Typeface define a família da fonte, seu peso (normal, bold) e estilo (normal, italic). De acordo com Google Developers, Typeface suporta carregamento de arquivos TTF, OTF, fontes XML e recursos do sistema. É a classe central para gerenciamento de tipografia em aplicativos Android.
Principais Conclusões
Typeface — é uma classe Android que encapsula informações da fonte: sua família (Roboto, Arial, Serif) e modificadores de estilo (bold, italic). Ao contrário do UIFont no iOS, Typeface não contém informação de tamanho — o tamanho do texto é definido separadamente pela propriedade textSize no TextView ou TextStyle no Spannable. Typeface é responsável apenas pelo tipo e família da fonte.
A classe está disponível em todos os níveis de API. Antes do Android 4.4, Typeface só suportava um conjunto limitado de fontes do sistema: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF. A partir do Android 8.0 (API 26), foi adicionado suporte para carregamento de fontes personalizadas via recursos XML, e o Android 10 adicionou suporte para fontes variáveis.
O Android fornece várias instâncias Typeface integradas: Typeface.DEFAULT — fonte do sistema Roboto (Material) ou Noto (AOSP), DEFAULT_BOLD — versão em negrito, MONOSPACE — fonte monoespaçada para código, SERIF — fonte com serifa (Noto Serif), SANS_SERIF — sem serifa (Noto Sans). Essas constantes estão disponíveis sem contexto e não requerem permissões de leitura de arquivos.
O sistema Android usa Typeface para renderizar todo o texto, incluindo interface do sistema, títulos, legendas e notificações. Cada aplicativo pode substituir a fonte padrão via tema (android:fontFamily) ou programaticamente via setTypeface(). Typeface se aplica a todos os componentes herdados de TextView: botões, EditText e visualizações personalizadas.
Android 8.0+ permite adicionar fontes a res/font e usá-las via recursos XML. O arquivo de fonte (TTF ou OTF) é colocado em res/font, após o que é criada uma referência R.font.font_name. Typeface é carregado via ResourcesCompat.getFont(context, R.font.font_name). Este método é preferível porque a fonte é compilada no APK e suporta sistemas de build ProGuard.
A abordagem de recursos também suporta famílias de fontes via um arquivo XML em res/font: você pode especificar vários arquivos para diferentes tipos (regular, bold, italic) e o sistema selecionará automaticamente o arquivo apropriado ao chamar setTypeface. Isso simplifica a tipografia — basta definir fontFamily no tema, e o Android escolherá o arquivo correto automaticamente.
O método Typeface.create(Typeface family, int style) cria uma instância de fonte com a família e estilo especificados. Se a família já tiver o estilo solicitado, a instância existente é retornada. Se o estilo não existir, o Android o sintetiza — aplicando pseudo-negrito ou itálico artificial à fonte base.
val boldTypeface = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD)
val italicTypeface = Typeface.create(Typeface.MONOSPACE, Typeface.ITALIC)
val customTypeface = ResourcesCompat.getFont(context, R.font.montserrat_regular)
textView.typeface = boldTypeface
O pseudo-negrito sintetizado pode parecer de baixa qualidade em fontes finas. Para melhores resultados, use um arquivo de fonte com um tipo bold real. Typeface.create() com um estilo inexistente não lança exceção, mas retorna a variante disponível mais próxima.
Para carregar Typeface de assets, use Typeface.createFromAsset(assetManager, path). A fonte é colocada no diretório src/main/assets/fonts/, e o caminho é especificado relativo a assets. Este método funciona em todas as versões do Android, mas não suporta famílias de fontes e requer especificar um arquivo específico para cada tipo.
O método Typeface.createFromFile(File) carrega uma fonte de um arquivo qualquer no sistema de arquivos. Isso é útil para fontes baixadas da rede ou copiadas para o armazenamento interno do aplicativo. createFromFile também não requer contexto, o que é conveniente para tarefas em segundo plano, mas o arquivo deve ser legível.
Carregar Typeface repetidamente de assets via createFromAsset pode levar à criação de objetos duplicados. Cada chamada createFromAsset recarrega o arquivo. Recomenda-se implementar um cache Typeface usando um HashMap, onde a chave é o caminho do arquivo e o valor é a instância carregada. Isso é especialmente relevante para listas com diferentes tipos de fonte.
object TypefaceCache {
private val cache = mutableMapOf<String, Typeface>()
fun getTypeface(context: Context, filename: String): Typeface {
return cache.getOrPut(filename) {
Typeface.createFromAsset(context.assets, "fonts/$filename")
}
}
}
// Usage
val typeface = TypefaceCache.getTypeface(context, "Roboto-Bold.ttf")
Um cache em memória garante que uma fonte seja carregada apenas uma vez por sessão do aplicativo. Em mudanças de configuração (rotação de tela), o cache persiste porque reside em um objeto companion. Para limpar o cache em caso de pouca memória, use WeakHashMap ou escute onTrimMemory.
Typeface é aplicado a TextView via o método setTypeface(Typeface tf) ou setTypeface(Typeface tf, int style). A segunda variante permite alterar o estilo (bold/italic) em relação à fonte atual. Em XML, o atributo android:fontFamily é usado com uma referência à fonte ou família do sistema. Para configuração programática, chamar setTypeface(monospaceTypeface) substitui a fonte pela especificada.
Typeface afeta todo o texto do TextView. Se forem necessárias fontes diferentes em uma única linha, use SpannableString com TypefaceSpan. TypefaceSpan aceita Typeface ou família e é aplicado a um intervalo de caracteres. Esta é a única maneira de misturar fontes dentro de um único TextView sem componentes aninhados.
Aplique TypefaceSpan apenas a parte da string. Por exemplo, um valor de variável no texto deve ser monoespaçado enquanto o restante do texto permanece com a fonte do sistema. Crie um SpannableString e defina um TypefaceSpan com Typeface MONOSPACE no intervalo desejado. O restante do texto mantém a fonte original do TextView.
val text = "Code: variableName"
val spannable = SpannableString(text)
spannable.setSpan(
TypefaceSpan(Typeface.MONOSPACE),
5, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spannable.setSpan(
ForegroundColorSpan(Color.BLUE),
5, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable
O texto “variableName” aparecerá em fonte monoespaçada azul, enquanto a palavra “Código:” permanece na fonte do sistema. TypefaceSpan pode ser combinado com qualquer outro span para controle preciso sobre cada segmento de texto.
O Android suporta vários formatos de fonte: TrueType (TTF), OpenType (OTF) e Web Open Font Format (WOFF2) a partir do Android 10. TTF e OTF são os principais formatos para fontes personalizadas. As fontes XML (Font Family) não são um formato separado, mas servem como descrição de qual arquivo usar para cada tipo.
Para usar uma fonte personalizada via res/font, crie um arquivo XML de família especificando os caminhos para os arquivos de fonte para regular, bold e italic. Em seguida, no tema do aplicativo, especifique android:fontFamily="@font/custom_family". Todas as instâncias de TextView que usam este tema obterão automaticamente o tipo correto para cada estilo.
Se uma fonte for baixada da rede, salve-a em filesDir ou cacheDir e carregue-a via Typeface.createFromFile. Após o carregamento, atualize o Typeface no TextView. Para carregamento assíncrono, use coroutine ou DownloadManager e, após a conclusão, publique na thread de UI via Handler. Este é um cenário típico para aplicativos com tipografia personalizada carregada sob demanda.
// Save font file to internal storage
val fontFile = File(context.cacheDir, "downloaded-font.otf")
fontFile.outputStream().use { output ->
// inputStream from network
inputStream.copyTo(output)
}
// Create Typeface from file
val downloadedTypeface = Typeface.createFromFile(fontFile)
textView.typeface = downloadedTypeface
Antes de carregar, verifique a disponibilidade do arquivo: se o arquivo estiver corrompido ou inválido, Typeface.createFromFile lança uma RuntimeException. Recomenda-se envolver a chamada em try-catch e, em caso de erro, usar a fonte do sistema padrão.
No Jetpack Compose, o Typeface do SDK Android não é usado diretamente. Em vez disso, o Compose fornece FontFamily e FontWeight para tipografia. FontFamily é carregado via Font.Resource e Font.File. O sistema de tipografia do Compose é definido via MaterialTheme.typography, onde cada estilo (h1, body1, button) pode receber uma FontFamily personalizada.
Para carregar uma fonte de recursos, o Compose usa Font(R.font.font_name, weight, style). Uma fonte de assets é carregada via Font(assetPath = "fonts/custom.otf", weight, style). Após definir a fonte, ela é passada para Typography e então aplicada via MaterialTheme.typography.bodyLarge e estilos semelhantes.
Se você tiver um Typeface existente criado via SDK Android, ele pode ser usado no Compose via TypefaceAdapter ou criando uma FontFamily baseada no Typeface. Obtenha o Typeface de Typeface.create e passe-o para FontFamily.Custom(listOf(Font(typeface))). No entanto, a abordagem nativa com Font.Resource é recomendada, pois é melhor otimizada para o Compose.
Carregar fontes de arquivos é uma operação potencialmente cara. Cada chamada a Typeface.createFromAsset ou Typeface.createFromFile lê o arquivo do disco, analisa-o e cria um objeto Typeface. Para fontes de 1-2 MB, isso leva de 10 a 50 ms na inicialização a frio. O armazenamento em cache de Typeface é uma prática obrigatória para aplicativos com fontes personalizadas.
O SDK Android não armazena em cache fontes criadas via createFromAsset ou createFromFile. Ao contrário das fontes do sistema, que são pré-carregadas no processo Zygote, as fontes personalizadas são carregadas a cada acesso. Recomenda-se usar LruCache ou ConcurrentHashMap com um identificador de fonte como chave. Um tamanho de cache de 10-20 instâncias cobre o conjunto típico de fontes de um aplicativo.
Android 8.0+ otimiza o carregamento de fontes através de XML Font Family. Ao especificar android:fontFamily="@font/my_family" no layout XML, o Android carrega a fonte preguiçosamente — apenas quando o componente se torna visível. O sistema também armazena em cache as fontes carregadas via ResourcesCompat.getFont() em um cache global de processos. Isso torna a abordagem de recursos a mais eficiente.
Ao usar Typeface em adaptadores RecyclerView, é importante não carregar a fonte no método onBindViewHolder. Realize o carregamento uma vez ao criar o adaptador ou use um ViewHolder com Typeface pré-carregado. Se cada item da lista exigir uma fonte única, implemente um cache usando WeakHashMap e limpe-o ao rolar além das posições visíveis para economizar memória.
Perguntas Frequentes
Typeface — é uma instância concreta de fonte para uso programático. FontFamily — é um recurso XML que descreve um grupo de arquivos de fonte para diferentes tipos (regular, bold, italic). Em tempo de execução, FontFamily é convertido em Typeface via ResourcesCompat.getFont. Typeface pode ser criado diretamente de um arquivo, ignorando FontFamily.
Use Typeface.createFromFile(File) ou Typeface.DEFAULT. Esses métodos não requerem contexto, pois trabalham com o sistema de arquivos ou constantes integradas. Para carregar de assets ou recursos, o contexto é necessário porque o acesso ao AssetManager e aos recursos do aplicativo é exigido.
Não, WebView usa a propriedade CSS font-family para especificar fontes. Para usar uma fonte personalizada no WebView, coloque o arquivo de fonte em assets e especifique-o via @font-face no CSS. O Typeface do SDK Android funciona apenas com componentes de UI nativos (TextView e seus descendentes).
Sim, a partir do Android 10 (API 29). As fontes variáveis são carregadas via ResourcesCompat.getFont ou Typeface.createFromFile. Para configurar eixos de variação (weight, width), use FontStyle no Compose ou atributos XML. Alterações programáticas de eixos só podem ser feitas através das APIs de baixo nível do Skia.
As razões mais comuns: o arquivo de fonte está faltando no projeto, o nome do arquivo está incorreto, a fonte está corrompida ou um estilo sintetizado é usado e não existe no arquivo. Verifique se o arquivo foi adicionado a res/font ou assets e se o nome foi especificado sem extensão no caso da abordagem de recursos.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também