El arte de las fuentes Tipografías avanzadas y estilos de texto en Compose

Si te estás lanzando al mundo de Jetpack Compose, te habrás dado cuenta de que manejar el texto es un mundo fascinante. Ya no estamos atados a los tediosos archivos XML de los estilos clásicos, sino que ahora tenemos el control total desde Kotlin, lo que hace que personalizar la apariencia de nuestra interfaz sea mucho más fluido y natural.

En este sentido, dominar la tipografía no es solo cuestión de elegir una letra bonita, sino de saber cómo estructurar la jerarquía visual de la aplicación para que el usuario no se pierda. Desde un simple cambio de color hasta implementaciones complejas de fuentes variables, Compose nos ofrece un abanico de herramientas brutales para que nuestra app luzca profesional.

Configuración de Fuentes y Familias

Para empezar, el componente Text dispone del parámetro fontFamily. Por defecto, Compose ya nos trae las familias básicas como Serif, SansSerif, Monospace y Cursive, que vienen integradas y nos sacan del apuro en prototipos rápidos.

Sin embargo, lo más habitual es querer usar fuentes propias. Para ello, debemos guardar los archivos en la carpeta res/font y definirlos mediante la función Font. Lo ideal es crear un objeto de FontFamily que agrupe los distintos pesos (Light, Normal, Medium, Bold) y estilos (Italic), permitiéndonos cambiar el grosor del texto simplemente ajustando el parámetro fontWeight en el Composable.

Fuentes Descargables de Google

A partir de la versión 1.2.0, Compose permite integrar Google Fonts de forma asíncrona. Esto es una maravilla porque evita que la app pese demasiado. Para lograrlo, necesitamos configurar un GoogleFont.Provider con las credenciales correspondientes y definir la familia de fuentes llamando al nombre exacto de la fuente en el catálogo de Google.

Un truco vital aquí es configurar fuentes de resguardo (fallback). Si por algún motivo la fuente en línea no se descarga, Compose puede recurrir a un archivo local en R.font, evitando que la interfaz se rompa o se vea mal. Además, si tenemos problemas, podemos implementar un CoroutineExceptionHandler para depurar los errores de carga en los logs.

Fuentes Variables y Ejes Personalizados

Las fuentes variables son el siguiente nivel. A diferencia de las estáticas, un solo archivo puede contener múltiples estilos. Esto es compatible con Android O en adelante. Mediante la API de FontVariation.Settings, podemos ajustar con precisión quirúrgica el peso, el ancho y la inclinación del texto.

Lo más interesante es que existen ejes personalizados. Algunas fuentes, como Roboto Flex, permiten modificar el ancho del contador o la altura de los ascendentes mediante códigos específicos como «YTAS» o «XTRA». Para implementar esto, se recomienda crear funciones de ayuda que validen que los valores estén dentro del rango permitido por la fuente antes de aplicarlos al TextStyle.

Estilos de Texto y Diseño Avanzado

Tipografías avanzadas y estilos de texto en Compose

Si queremos ir más allá de un color sólido, Compose nos permite jugar con el parámetro style. Aquí podemos añadir sombras con desplazamiento y radio de desenfoque, lo que aporta una profundidad increíble a los encabezados.

El poder de AnnotatedString

Cuando necesitamos que una misma frase tenga distintos colores o grosores, el texto simple no basta. Aquí entra en juego AnnotatedString y su constructor buildAnnotatedString. Con esto podemos intercalar estilos usando SpanStyle para el color y peso, y ParagraphStyle para la alineación o el interlineado.

Incluso podemos renderizar contenido HTML. La función AnnotatedString.fromHtml() convierte etiquetas básicas de HTML en texto estilizado, permitiendo que los vínculos sean clicables y tengan un aspecto diferenciado mediante TextLinkStyles.

Efectos Visuales: Brush y Marquesina

Para los que buscan un look moderno, la API de Brush permite aplicar degradados lineales o radiales directamente al texto. Podemos combinar esto con el parámetro alpha en SpanStyle para crear efectos donde una parte del texto es más opaca que otra, generando un contraste muy elegante.

Por otro lado, si el texto es demasiado largo para el espacio disponible, podemos usar el modificador basicMarquee. Esto crea el clásico efecto de desplazamiento animado, ideal para noticias o tickers, el cual es totalmente personalizable en cuanto a velocidad y demora.

Integración con Material Design y Temas

No tiene sentido configurar cada texto a mano. Lo inteligente es aprovechar el MaterialTheme. En el archivo Type.kt, definimos un objeto Typography donde sobrescribimos los estilos predeterminados como h1, body1 o caption.

Al envolver nuestra app en un MaterialTheme de última generación, todos los componentes heredan estas reglas. Si necesitamos un ajuste puntual, podemos usar la función copy() de la data class de estilo, manteniendo la base de la tipografía del tema pero alterando un solo atributo, como añadirle una sombra específica a un h4.

Es fundamental entender que, si no usamos un tema, Compose aplicará los valores por defecto del sistema operativo (como Segoe UI en Windows), lo que puede hacer que la app se vea inconsistente. El uso de estilos coherentes en Color, Type y Shape garantiza que la experiencia de usuario sea fluida y profesional en cualquier dispositivo.

Tener un control total sobre la tipografía implica saber navegar desde la carga de archivos locales y fuentes variables hasta el uso de degradados y temas globales de Material Design, permitiendo que el texto no solo comunique información, sino que también refuerce la identidad visual de la aplicación.