2017-10-05 8 views
4

La fonction Fonts in XML vous permet de spécifier différents poids de police pour une famille de polices. Par exemple:Comment utiliser les poids spécifiés pour les polices au format 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/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 du code Java. Leur attribut fontWeight n'est pas disponible pour TextView, et l'objet Typeface créé à partir de ResourcesCompat.getFont(context, R.font.archivo_narrow) ne mentionne pas les poids de police.

Je me rends compte que je peux simplement préciser la ressource de police spécifique (à savoir R.font.archivo_narrow_semibold), mais alors quel est le point d'avoir un attribut fontWeight dans le font-family?

Répondre

-1

Il ressemble à l'androïde suivant les normes du Web pour la gestion des polices et le dimensionnement pour l'application Android.

La propriété "font-weight" est utilisée pour définir le poids d'une police, telle que régulière ou en 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 les poids de police autres que les caractères & en gras. Le tableau suivant décrit les correspondances possibles de poids aux 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 here


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> 

de 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> 

Kotlin Utilisation:

val textView = dialog.findViewById<TextView>(android.R.id.message) as TextView 
val typeface = ResourcesCompat.getFont(context,R.font.cc_montserrat_regular) 
     textView.typeface = typeface 

Android Project Screenshot:

enter image description here

+0

Oui, mais comment puis-je * utiliser * Les différents poids-police? – Bryan

+0

Ne pas peser pour identifier les polices individuellement? Pouvez-vous me donner un exemple de ce que vous confondez? –

+0

Je peux spécifier l'attribut 'font-weight' dans la balise' ', mais je ne trouve pas un moyen de * référencer * cet attribut' font-weight' ailleurs dans mon code (c.-à-d.Je peux * fixer * le poids, je ne peux pas * utiliser * le poids). Il existe un attribut ['textStyle'] (https://developer.android.com/reference/android/widget/TextView.html#attr_android:textStyle), mais vous ne pouvez spécifier que" bold "," italic "ou" bold " italique Il n'y a pas de semibold par exemple. – Bryan

0

Edit: ce n'est pas une solution à la demande:/

J'ai trouvé la classe Typeface.Builder qui je pense est ce que vous voulez. Malheureusement, il n'est disponible qu'à partir du niveau 26 de l'API. Peut-être qu'une bibliothèque compat 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

Non, malheureusement, vous pouvez seulement définir le poids par 'Typeface.Builder'; il n'y a toujours aucun moyen de référencer ce poids à travers la 'Typeface' qui est créée. – Bryan

+0

Ouais, désolé, j'ai trouvé une entrée de poids et je me suis excité sans vraiment comprendre. - J'ai trouvé votre StackOverflow essayant de trouver la même chose moi-même. Après avoir parcouru le code source tout ce que je peux trouver est que si vous faites référence à une famille de polices, il sera plus difficile d'obtenir le poids le plus proche de bold (700) si vous le spécifiez comme style de texte. Il n'y a aucun moyen de demander quel poids vous voulez. Espérons qu'ils l'ont mis dans bientôt, j'ai semi-gras utilisé comme poids de mon titre dans la plupart des conceptions et il serait vraiment utile d'avoir l'entrée de poids. – kassim