web-dev-qa-db-fra.com

Comment utiliser les poids spécifiés pour les polices en XML

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?


Mise à jour

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.

34
Bryan

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.

4
Bryan

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:

enter image description here

18
Rajesh Dalsaniya

voici comment utiliser différentes tailles de polices dans Android studio

  1. Ouvrir app/src/main/res/layout/you_awesome_layout.xml
  2. Sélectionnez le Design tab
  3. Dans le panneau Arborescence des composants, ouvrez vous TextView et sélectionnez View all attributes au bas du menu de droite
  4. Dans le panneau Attributs, ouvrez le menu déroulant fontFamily et sélectionnez More Fonts…
  5. Sélectionnez la famille YouFontFamilyName
  6. Sélectionnez le style Regular/Bold/Semibold/Black/WhateverStyleYouHaveThere

Voilà, je pense que c'est le seul moyen de réaliser ce que vous voulez

1
Wackaloon

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();
0
kassim