En utilisant la fonction Polices in XML , vous pouvez spécifier différents poids de police pour une famille de polices. Par exemple:
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<font Android:font="@font/archivo_narrow_regular" Android:fontWeight="400" Android:fontStyle="normal"
app:font="@font/archivo_narrow_regular" app:fontWeight="400" app:fontStyle="normal"/>
<font Android:font="@font/archivo_narrow_regular_italic" Android:fontWeight="400" Android:fontStyle="italic"
app:font="@font/archivo_narrow_regular_italic" app:fontWeight="400" app:fontStyle="italic"/>
<font Android:font="@font/archivo_narrow_medium" Android:fontWeight="500" Android:fontStyle="normal"
app:font="@font/archivo_narrow_medium" app:fontWeight="500" app:fontStyle="normal"/>
<font Android:font="@font/archivo_narrow_medium_italic" Android:fontWeight="500" Android:fontStyle="italic"
app:font="@font/archivo_narrow_medium_italic" app:fontWeight="500" app:fontStyle="italic"/>
<font Android:font="@font/archivo_narrow_semibold" Android:fontWeight="600" Android:fontStyle="normal"
app:font="@font/archivo_narrow_semibold" app:fontWeight="600" app:fontStyle="normal"/>
<font Android:font="@font/archivo_narrow_semibold_italic" Android:fontWeight="600" Android:fontStyle="italic"
app:font="@font/archivo_narrow_semibold_italic" app:fontWeight="600" app:fontStyle="italic"/>
<font Android:font="@font/archivo_narrow_bold" Android:fontWeight="700" Android:fontStyle="normal"
app:font="@font/archivo_narrow_bold" app:fontWeight="700" app:fontStyle="normal"/>
<font Android:font="@font/archivo_narrow_bold_italic" Android:fontWeight="700" Android:fontStyle="italic"
app:font="@font/archivo_narrow_bold_italic" app:fontWeight="700" app:fontStyle="italic"/>
</font-family>
Mais je ne peux pas comprendre comment utiliser réellement chacun de ces poids; soit dans un fichier XML (layout/style), soit dans Java. Il n'y a pas d'attribut fontWeight
disponible pour TextView
, et le Typeface
l'objet créé à partir de ResourcesCompat.getFont(context, R.font.archivo_narrow)
ne mentionne pas le poids des polices.
Je me rends compte que je peux simplement spécifier la ressource de police spécifique (c'est-à-dire R.font.archivo_narrow_semibold
), Mais quel est l'intérêt de disposer d'un attribut fontWeight
dans le font-family
?
Une nouvelle méthode create(Typeface family, int weight, boolean italic)
statique a été ajoutée dans l'API niveau 28, avec une méthode getWeight()
. Ceci permet enfin d'utiliser l'attribut fontWeight
dans Java; bien que pour l'API de niveau 28 ou supérieur, je n'ai trouvé aucun analogue dans la bibliothèque de support. .
Ceci est utile - et montre que l'attribut fontWeight
ne servait à rien par le passé - mais j'aimerais vraiment pouvoir utiliser le poids dans le style XML.
Comme l'a souligné @ FlorianWalther, l'attribut textFontWeight
est exactement ce que je cherchais. Cet attribut a apparemment été ajouté au niveau 28 de l'API, mais n'a été documenté que récemment .
Assurez-vous que tous les poids sont dans le même fichier XML (comme dans ma question), puis utilisez simplement l'attribut avec l'attribut fontFamily
.
<TextView Android:id="@+id/weightedTextView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:fontFamily="@font/archivo_narrow"
Android:textFontWeight="700"/>
Autant que je sache, cet attribut n'est disponible que dans l'API de niveau 28 et supérieur, je le mettrai à jour si je trouve son équivalent dans la bibliothèque de support.
Cela ressemble à Android suit les normes Web pour la gestion des polices et le dimensionnement de Android app.
La propriété “font-weight” est utilisée pour définir le poids d'une police, par exemple normal ou gras.
Mais pour tous les autres poids, une plage numérique de 100 à 900 est utilisée. L'un des problèmes avec les polices Web est que la plupart des navigateurs Web ne prennent pas en charge correctement le poids des polices autre que normal et gras. Le tableau suivant décrit les correspondances possibles entre les pondérations et les définitions numériques:
100 Extra Light or Ultra Light
200 Light or Thin
300 Book or Demi
400 Normal or Regular
500 Medium
600 Semibold, Demibold
700 Bold
800 Black, Extra Bold or Heavy
900 Extra Black, Fat, Poster or Ultra Black
Vous pouvez en savoir plus sur le poids de la police ici
cc_montserrat_bold.xml
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<font
Android:font="@font/montserrat_bold"
Android:fontStyle="normal"
Android:fontWeight="700"
app:font="@font/montserrat_bold"
app:fontStyle="normal"
app:fontWeight="700" />
<font
Android:font="@font/montserrat_bolditalic"
Android:fontStyle="italic"
Android:fontWeight="700"
app:font="@font/montserrat_bolditalic"
app:fontStyle="italic"
app:fontWeight="700" />
</font-family>
cc_montserrat_regular.xml
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<font
Android:font="@font/montserrat_regular"
Android:fontStyle="normal"
Android:fontWeight="400"
app:font="@font/montserrat_regular"
app:fontStyle="normal"
app:fontWeight="400" />
<font
Android:font="@font/montserrat_italic"
Android:fontStyle="italic"
Android:fontWeight="400"
app:font="@font/montserrat_italic"
app:fontStyle="italic"
app:fontWeight="400" />
</font-family>
Utilisation de Kotlin:
val textView = dialog.findViewById<TextView>(Android.R.id.message) as TextView
val typeface = ResourcesCompat.getFont(context,R.font.cc_montserrat_regular)
textView.typeface = typeface
Capture d'écran du projet Android:
voici comment utiliser différentes tailles de polices dans Android studio
app/src/main/res/layout/you_awesome_layout.xml
Design tab
TextView
et sélectionnez View all attributes
au bas du menu de droitefontFamily
et sélectionnez More Fonts…
YouFontFamilyName
Regular/Bold/Semibold/Black/WhateverStyleYouHaveThere
Voilà, je pense que c'est le seul moyen de réaliser ce que vous voulez
Edit: ce n'est pas une solution de la requête:/
J'ai trouvé la classe Typeface.Builder que je pense être ce que vous voulez. Malheureusement, il n'est disponible qu'à partir de l'API de niveau 26 ou supérieur. Peut-être qu'une bibliothèque compatible apparaîtra bientôt.
https://developer.Android.com/reference/Android/graphics/Typeface.Builder.html
Typeface.Builder buidler = new Typeface.Builder("your_font_file.ttf");
builder.setFontVariationSettings("'wght' 700, 'slnt' 20, 'ital' 1");
builder.setWeight(700); // Tell the system that this is a bold font.
builder.setItalic(true); // Tell the system that this is an italic style font.
Typeface typeface = builder.build();