Recientemente encontré el problema del texto falso en negrita y cursiva al usar la familia de fuentes en el desarrollo de Android.
En este artículo quiero hablar sobre este problema y su solución.
Crear una familia de fuentes
A partir de API 26, fue posible combinar fuentes en familias.
Una familia de fuentes es una colección de archivos de fuentes con su estilo y peso.
Puede crear una nueva familia de fuentes como recurso XML y referirse a ella como un elemento único, en lugar de referirse a cada estilo y peso como recursos separados.
De esta forma, el sistema podrá seleccionar la fuente correcta según el estilo del texto que está intentando utilizar.
Archivo de ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:fontStyle="normal"
android:fontWeight="400"
android:font="@font/lobster_regular" />
<font
android:fontStyle="italic"
android:fontWeight="400"
android:font="@font/lobster_italic" />
</font-family>
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:fontStyle="normal"
app:fontWeight="400"
app:font="@font/lobster_regular" />
<font
app:fontStyle="italic"
app:fontWeight="400"
app:font="@font/lobster_italic" />
</font-family>El atributo fontStyledetermina el estilo de la fuente: regular ( normal) o cursiva ( italic).
A su vez, fontWeightestablece el peso, también conocido como el peso de la fuente.
Y, por supuesto, fontestablecerá la fuente que se utilizará para el fontWeighty fontStyle.
Peso de fuente
Este estándar proviene del desarrollo web. El valor se establece entre 100 y 900 en incrementos de 100.
La siguiente tabla corresponde a los nombres comunes de saturación:
| Valor | Nombre común |
|---|---|
| 100 | () |
| 200 | |
| 300 | |
| 400 | |
| 500 | |
| 600 | |
| 700 | |
| 800 | |
| 900 | () |
, , — 400, — 700.
, Android , .
, .
, , . , - .
, lobster_two.xml , , , :
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:fontStyle="normal"
app:fontWeight="400"
app:font="@font/lobster_two_normal" />
<font
app:fontStyle="italic"
app:fontWeight="400"
app:font="@font/lobster_two_italic" />
<font
app:fontStyle="normal"
app:fontWeight="700"
app:font="@font/lobster_two_bold" />
<font
app:fontStyle="italic"
app:fontWeight="700"
app:font="@font/lobster_two_bold_italic" />
</font-family>
, lobster_two_incomplete.xml :
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
app:fontStyle="normal"
app:fontWeight="400"
app:font="@font/lobster_two_normal" />
</font-family>
.
lobster_two_incomplete.xml, lobster_two.xml, .
, , .
//
val typeFace = resources.getFont(R.font.lobster_two)
textView.setTypeface(typeFace, Typeface.BOLD)
//
textView.typeface = resources.getFont(R.font.lobster_two_bold)
//
val typeFace = resources.getFont(R.font.lobster_two_incomplete)
textView.setTypeface(typeFace, Typeface.BOLD)
//
val typeFace = resources.getFont(R.font.lobster_two_normal)
textView.setTypeface(typeFace, Typeface.BOLD)
xml
//
<TextView
...
android:fontFamily="@font/lobster_two"
android:textStyle="bold|italic"/>
//
<TextView
...
android:fontFamily="@font/lobster_two_bold_italic"/>
//
<TextView
...
android:fontFamily="@font/lobster_two_incomplete"
android:textStyle="bold|italic"/>
//
<TextView
...
android:fontFamily="@font/lobster_two"
android:textStyle="bold"/>
//
<TextView
...
android:fontFamily="@font/lobster_two_bold"/>
//
<TextView
...
android:fontFamily="@font/lobster_two_normal"
android:textStyle="bold"/>