代码之家  ›  专栏  ›  技术社区  ›  Bryan

如何为XML中的字体使用指定的权重

  •  78
  • Bryan  · 技术社区  · 7 年前

    使用 Fonts in 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>
    

    但我不知道如何真正利用这些权重;可以在XML(布局/样式)文件中,也可以在Java代码中。他们的不是 fontWeight 属性可用于 TextView ,以及 Typeface 对象创建自 ResourcesCompat.getFont(context, R.font.archivo_narrow) 没有提到字体权重。

    我意识到我可以只指定特定的字体资源(即。 R.font.archivo_narrow_semibold ),那么,拥有一个 字体权重 中的属性 font-family ?


    使现代化

    一个新的静态 create(Typeface family, int weight, boolean italic) API级别28中添加了方法,以及 getWeight() 实例方法。这最终使利用 字体权重 Java代码中的属性;虽然仅适用于API级别28及更高版本,但我在支持库中未找到任何类似项。

    这是有用的,并且表明 字体权重 属性在过去没有任何用途,但我真的希望能够在XML样式中使用权重。

    9 回复  |  直到 4 年前
        1
  •  72
  •   Rajesh Dalsaniya    7 年前

    它看起来像是android在遵循android应用程序字体管理和大小调整的网络标准。

    font-weight属性用于定义字体的权重,例如常规字体或粗体字体。

    但对于所有其他权重,使用的数值范围为100到900。web字体面临的一个挑战是,大多数web浏览器都不能正确支持除普通字体以外的字体权重;大胆的下图描述了权重到数值定义的可能映射:

    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
    

    您可以阅读有关字体权重的更多信息 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>
    

    <?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用途:

    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项目截图:

    enter image description here

        2
  •  27
  •   Bryan    4 年前

    正如@FlorianWalther所指出的 TextView.textFontWeight 属性正是我想要的。该属性显然是在API级别28中添加的,但是 was not documented until recently .

    确保所有权重都在同一个XML文件中(如我的问题所示),然后只需将该属性与 fontFamily 属性

    <TextView android:id="@+id/weightedTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/archivo_narrow"
        android:textFontWeight="700"/>
    

        3
  •  18
  •   cactustictacs    3 年前

    Android似乎忽略了字体家族中的所有内容,除了字体权重700和400,用于加粗和非加粗 textStyle 分别为。

    就是这样。可以有常规的400/700和斜体的400/700。其他定义似乎都没有被使用,只有在使用较新的API时,你才能真正使用它们。如果我遗漏了什么,请告诉我,但这似乎是您在较低的API上可以控制的全部内容-粗体或非粗体。


    bold 但是你没有任何关于体重的定义 700 中等500 对于这种样式“-您必须创建一个单独的字体系列并明确使用它,在这一点上,您最好只指定实际的字体,而不是?


    为了完整起见,我做了多字体系列的事情(我使用的每种字体都有一个单独的字体-常规、中等等等),并将它们应用于 style s由 Material Design type scale generator . 类型比例使用不同的权重,如 对于 头条新闻1 中等的 对于 但是很明显Android没有使用它们(而且它们也没有在样式层次结构中指定)。

    <style name="TextAppearance.MdcTypographyStyles.Headline1" parent="TextAppearance.MaterialComponents.Headline1">
        <item name="fontFamily">@font/my_font_weight_light</item>
        <item name="android:fontFamily">@font/my_font_weight_light</item>
        <item name="android:textSize">123sp</item>
        <item name="android:letterSpacing">-0.0122</item>
    </style>
    

    哪里 my_font_weight_light.xml 是一个仅包含 字体的变体

    <font-family xmlns:app="http://schemas.android.com/apk/res-auto">
        <font
            app:font="@font/my_font_light_italic"
            app:fontStyle="italic"
            app:fontWeight="400" />
        <font
            app:font="@font/my_font_light"
            app:fontStyle="normal"
            app:fontWeight="400" />
    </font-family>
    

    重量不对, 400 有规律的 大胆的 由于样式使用固定权重,我无论如何都不会使用粗体。

    ( 700 使其在不同的API之间保持一致。因此,正确的重量可能很重要——或者至少选择以下哪一种 400 离它最近。我不能花时间测试所有这些,所以我只是在尝试!)


    下一个有趣的事情是,如果你正在通过主题将字体系列应用到你的整个应用程序中,通过设置 fontFamily 属性, that will override any fontFamily settings you apply through textAppearance text外观 . 因此,你的“加权”风格将减轻其“重量”,因为 字体系列 普通400

    为了避免这种情况,你必须运用你的风格 作为一种风格,而不是文字外观 ,即:

    style="@style/TextAppearance.MdcTypographyStyles.Headline1"
    

    享乐

        4
  •  5
  •   Marius Kohmann    4 年前

    textFontWeight 属性为API级别28及更高版本。支持旧设备的解决方法是为每个字体权重创建单独的字体系列,并从视图中引用字体系列。

    <TextView
        ...
        android:fontFamily="@font/fontFamily_your_font_demibold 
    />
    

    res/font/fontFamily\u your\u font\u demibold。xml

    <font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <font
            app:font="@font/your_font_demibold"
            app:fontStyle="normal"
            app:fontWeight="600" />
    
    </font-family>
    

    res/font/fontfamine\u your\u font\u bold。xml

    <font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <font
            app:font="@font/your_font_bold"
            app:fontStyle="normal"
            app:fontWeight="800" />
    
    </font-family>
    
        5
  •  3
  •   Peterdk    4 年前

    对我来说,当我创建一个。每个权重的xml文件,包括法线和斜体,然后在布局或样式中同时使用两者引用它们 android:fontFamily: fontFamily: . 后者很重要,否则它只能在非常高的API级别下工作。

        <font-family xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
    
        <font android:font="@font/internal_inter_bold" 
            android:fontStyle="normal"
            android:fontWeight="700"
            app:font="@font/internal_inter_bold"
            app:fontStyle="normal"
            app:fontWeight="700" />
        <font android:font="@font/internal_inter_bold_italic"
            android:fontStyle="italic"
            android:fontWeight="700"
            app:font="@font/internal_inter_bold_italic"
            app:fontStyle="italic"
            app:fontWeight="700" />
         </font-family>
    
    
    
         <style name="numbers_large">
            <item name="android:textSize">32sp</item>
            <item name="android:fontFamily">@font/inter_bold</item>
            <item name="fontFamily">@font/inter_bold</item>
        </style>
    

    即使在安卓5.0中,这也能正常工作,并没有对较低版本进行测试。

        6
  •  1
  •   kassim    6 年前

    编辑:这不是请求的解决方案:/

    我找到了 字体。建设者 我想这就是你想要的。不幸的是,它只能从API级别26及更高版本获得。也许compat库很快就会出现。

    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();
    
        7
  •  0
  •   Wackaloon    6 年前

    下面是如何在android studio中使用不同字体的权重

    1. app/src/main/res/layout/you_awesome_layout.xml
    2. 选择 Design tab
    3. 在组件树面板中,打开 TextView 并选择 View all attributes 在右菜单的底部
    4. 在属性面板中,打开 fontFamily 下拉并选择 More Fonts…
    5. 选择族 YouFontFamilyName
    6. 选择样式 Regular/Bold/Semibold/Black/WhateverStyleYouHaveThere

        8
  •  -1
  •   Minion    5 年前

    第一步:找到或下载你的字体,比如说cavier_dream

    第2步:右键单击res文件夹,并在res文件夹内创建字体资源文件夹

    第三步:右键点击字体文件夹,创建一个字体资源文件,比如说app\u font。xml

    第4步:打开app_字体。xml文件并修改如下

    <?xml version="1.0" encoding="utf-8"?>
    

    <font
        android:font="@font/cavier_dream"
        android:fontWeight="400"
        android:fontStyle="normal"
        app:fontWeight="400"
        app:fontStyle="normal"
        app:font="@font/cavier_dream"/>
    

    用法:

    要在整个应用程序中获得全局使用,请转到样式。xml并在主题内创建一个新项,如下所示

     <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:fontFamily">@font/app_font</item>
    </style>
    

    对于本地使用,只需使用 属性并将app_字体设置为值。

    快乐编码:)

        9
  •  -1
  •   Jacob N.    4 年前

    请参阅Android官方参考,了解字体权重值:

    整数字体的权重。当字体加载到字体堆栈中并覆盖字体标题表中的任何权重信息时,将使用此属性。 属性值必须是正数,是100的倍数,介于100和900之间(包括100和900)。 如果不指定属性,应用程序将使用字体标题表中的值。最常见的值是400表示常规权重,700表示粗体权重。

    https://developer.android.com/guide/topics/resources/font-resource