【Android】图文解密Android Font

1、TextView

在介绍Android Font之前,首先需要了解一下与Font相关的TextView的知识。TextView有许多属性,下面着重介绍几个。

1.1 Font Family

android:fontFamily:设置Font Family,可以是Android支持的Font Family,也可以是自定义的Font Family。既然称为Family,就会包含一组Font成员,每个Font成员的属性不同,使用不同的ttf文件。

Android支持的Font Family可参照frameworks/base/data/fonts/fonts.xml,代码如下。

<?xml version="1.0" encoding="utf-8"?>
<!--
    WARNING: Parsing of this file by third-party apps is not supported. The
    file, and the font files it refers to, will be renamed and/or moved out
    from their respective location in the next Android release, and/or the
    format or syntax of the file may change significantly. If you parse this
    file for information about system fonts, do it at your own risk. Your
    application will almost certainly break with the next major Android
    release.

    In this file, all fonts without names are added to the default list.
    Fonts are chosen based on a match: full BCP-47 language tag including
    script, then just language, and finally order (the first font containing
    the glyph).

    Order of appearance is also the tiebreaker for weight matching. This is
    the reason why the 900 weights of Roboto precede the 700 weights - we
    prefer the former when an 800 weight is requested. Since bold spans
    effectively add 300 to the weight, this ensures that 900 is the bold
    paired with the 500 weight, ensuring adequate contrast.
-->
<familyset version="22">
    <!-- first font is default -->
    <family name="sans-serif">
        <font weight="100" style="normal">Roboto-Thin.ttf</font>
        <font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
        <font weight="300" style="normal">Roboto-Light.ttf</font>
        <font weight="300" style="italic">Roboto-LightItalic.ttf</font>
        <font weight="400" style="normal">Roboto-Regular.ttf</font>
        <font weight="400" style="italic">Roboto-Italic.ttf</font>
        <font weight="500" style="normal">Roboto-Medium.ttf</font>
        <font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
        <font weight="900" style="normal">Roboto-Black.ttf</font>
        <font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
        <font weight="700" style="normal">Roboto-Bold.ttf</font>
        <font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
    </family>

    <!-- Note that aliases must come after the fonts they reference. -->
    <alias name="sans-serif-thin" to="sans-serif" weight="100" />
    <alias name="sans-serif-light" to="sans-serif" weight="300" />
    <alias name="sans-serif-medium" to="sans-serif" weight="500" />
    <alias name="sans-serif-black" to="sans-serif" weight="900" />
    <alias name="arial" to="sans-serif" />
    <alias name="helvetica" to="sans-serif" />
    <alias name="tahoma" to="sans-serif" />
    <alias name="verdana" to="sans-serif" />

    <family name="sans-serif-condensed">
        <font weight="300" style="normal">RobotoCondensed-Light.ttf</font>
        <font weight="300" style="italic">RobotoCondensed-LightItalic.ttf</font>
        <font weight="400" style="normal">RobotoCondensed-Regular.ttf</font>
        <font weight="400" style="italic">RobotoCondensed-Italic.ttf</font>
        <font weight="500" style="normal">RobotoCondensed-Medium.ttf</font>
        <font weight="500" style="italic">RobotoCondensed-MediumItalic.ttf</font>
        <font weight="700" style="normal">RobotoCondensed-Bold.ttf</font>
        <font weight="700" style="italic">RobotoCondensed-BoldItalic.ttf</font>
    </family>
    <alias name="sans-serif-condensed-light" to="sans-serif-condensed" weight="300" />
    <alias name="sans-serif-condensed-medium" to="sans-serif-condensed" weight="500" />

    <family name="serif">
        <font weight="400" style="normal">NotoSerif-Regular.ttf</font>
        <font weight="700" style="normal">NotoSerif-Bold.ttf</font>
        <font weight="400" style="italic">NotoSerif-Italic.ttf</font>
        <font weight="700" style="italic">NotoSerif-BoldItalic.ttf</font>
    </family>
    <alias name="times" to="serif" />
    <alias name="times new roman" to="serif" />
    <alias name="palatino" to="serif" />
    <alias name="georgia" to="serif" />
    <alias name="baskerville" to="serif" />
    <alias name="goudy" to="serif" />
    <alias name="fantasy" to="serif" />
    <alias name="ITC Stone Serif" to="serif" />

    <family name="monospace">
        <font weight="400" style="normal">DroidSansMono.ttf</font>
    </family>
    <alias name="sans-serif-monospace" to="monospace" />
    <alias name="monaco" to="monospace" />

    <family name="serif-monospace">
        <font weight="400" style="normal">CutiveMono.ttf</font>
    </family>
    <alias name="courier" to="serif-monospace" />
    <alias name="courier new" to="serif-monospace" />

    <family name="casual">
        <font weight="400" style="normal">ComingSoon.ttf</font>
    </family>

    <family name="cursive">
        <font weight="400" style="normal">DancingScript-Regular.ttf</font>
        <font weight="700" style="normal">DancingScript-Bold.ttf</font>
    </family>

    <family name="sans-serif-smallcaps">
        <font weight="400" style="normal">CarroisGothicSC-Regular.ttf</font>
    </family>

    <!-- fallback fonts -->
    <family lang="und-Arab" variant="elegant">
        <font weight="400" style="normal">NotoNaskhArabic-Regular.ttf</font>
        <font weight="700" style="normal">NotoNaskhArabic-Bold.ttf</font>
    </family>
    <family lang="und-Arab" variant="compact">
        <font weight="400" style="normal">NotoNaskhArabicUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font>
    </family>
    <family lang="und-Ethi">
        <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font>
    </family>
    <family lang="und-Hebr">
        <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font>
    </family>
    <family lang="und-Thai" variant="elegant">
        <font weight="400" style="normal">NotoSansThai-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansThai-Bold.ttf</font>
    </family>
    <family lang="und-Thai" variant="compact">
        <font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font>
    </family>
    <family lang="und-Armn">
        <font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font>
    </family>
    <!-- TODO: add Geok -->
    <family lang="und-Geor">
        <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font>
    </family>
    <family lang="und-Deva" variant="elegant">
        <font weight="400" style="normal">NotoSansDevanagari-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansDevanagari-Bold.ttf</font>
    </family>
    <family lang="und-Deva" variant="compact">
        <font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font>
    </family>

    <!-- All scripts of India should come after Devanagari, due to shared
         danda characters.
    -->
    <family lang="und-Gujr" variant="elegant">
        <font weight="400" style="normal">NotoSansGujarati-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansGujarati-Bold.ttf</font>
    </family>
    <family lang="und-Gujr" variant="compact">
        <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font>
    </family>
    <family lang="und-Guru" variant="elegant">
        <font weight="400" style="normal">NotoSansGurmukhi-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansGurmukhi-Bold.ttf</font>
    </family>
    <family lang="und-Guru" variant="compact">
        <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font>
    </family>
    <family lang="und-Taml" variant="elegant">
        <font weight="400" style="normal">NotoSansTamil-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansTamil-Bold.ttf</font>
    </family>
    <family lang="und-Taml" variant="compact">
        <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font>
    </family>
    <family lang="und-Mlym" variant="elegant">
        <font weight="400" style="normal">NotoSansMalayalam-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansMalayalam-Bold.ttf</font>
    </family>
    <family lang="und-Mlym" variant="compact">
        <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font>
    </family>
    <family lang="und-Beng" variant="elegant">
        <font weight="400" style="normal">NotoSansBengali-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansBengali-Bold.ttf</font>
    </family>
    <family lang="und-Beng" variant="compact">
        <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font>
    </family>
    <family lang="und-Telu" variant="elegant">
        <font weight="400" style="normal">NotoSansTelugu-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansTelugu-Bold.ttf</font>
    </family>
    <family lang="und-Telu" variant="compact">
        <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font>
    </family>
    <family lang="und-Knda" variant="elegant">
        <font weight="400" style="normal">NotoSansKannada-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansKannada-Bold.ttf</font>
    </family>
    <family lang="und-Knda" variant="compact">
        <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font>
    </family>
    <family lang="und-Orya" variant="elegant">
        <font weight="400" style="normal">NotoSansOriya-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansOriya-Bold.ttf</font>
    </family>
    <family lang="und-Orya" variant="compact">
        <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font>
    </family>

    <family lang="und-Sinh">
        <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font>
    </family>
    <family lang="und-Khmr" variant="elegant">
        <font weight="100" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="26.0" />
        </font>
        <font weight="200" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="39.0" />
        </font>
        <font weight="300" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="58.0" />
        </font>
        <font weight="400" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="90.0" />
        </font>
        <font weight="500" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="108.0" />
        </font>
        <font weight="600" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="128.0" />
        </font>
        <font weight="700" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="151.0" />
        </font>
        <font weight="800" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="169.0" />
        </font>
        <font weight="900" style="normal">NotoSansKhmer-VF.ttf
            <axis tag="wdth" stylevalue="100.0" />
            <axis tag="wght" stylevalue="190.0" />
        </font>
    </family>
    <family lang="und-Khmr" variant="compact">
        <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font>
    </family>
    <family lang="und-Laoo" variant="elegant">
        <font weight="400" style="normal">NotoSansLao-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansLao-Bold.ttf</font>
    </family>
    <family lang="und-Laoo" variant="compact">
        <font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font>
    </family>
    <family lang="und-Mymr" variant="elegant">
        <font weight="400" style="normal">NotoSansMyanmar-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansMyanmar-Bold.ttf</font>
    </family>
    <family lang="und-Mymr" variant="compact">
        <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font>
    </family>
    <family lang="und-Thaa">
        <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font>
    </family>
    <family lang="und-Cham">
        <font weight="400" style="normal">NotoSansCham-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansCham-Bold.ttf</font>
    </family>
    <family lang="und-Adlm">
        <font weight="400" style="normal">NotoSansAdlam-Regular.ttf</font>
    </family>
    <family lang="und-Avst">
        <font weight="400" style="normal">NotoSansAvestan-Regular.ttf</font>
    </family>
    <family lang="und-Bali">
        <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font>
    </family>
    <family lang="und-Bamu">
        <font weight="400" style="normal">NotoSansBamum-Regular.ttf</font>
    </family>
    <family lang="und-Batk">
        <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font>
    </family>
    <family lang="und-Brah">
        <font weight="400" style="normal">NotoSansBrahmi-Regular.ttf</font>
    </family>
    <family lang="und-Bugi">
        <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font>
    </family>
    <family lang="und-Buhd">
        <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font>
    </family>
    <family lang="und-Cans">
        <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font>
    </family>
    <family lang="und-Cari">
        <font weight="400" style="normal">NotoSansCarian-Regular.ttf</font>
    </family>
    <family lang="und-Cher">
        <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font>
    </family>
    <family lang="und-Copt">
        <font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font>
    </family>
    <family lang="und-Xsux">
        <font weight="400" style="normal">NotoSansCuneiform-Regular.ttf</font>
    </family>
    <family lang="und-Cprt">
        <font weight="400" style="normal">NotoSansCypriot-Regular.ttf</font>
    </family>
    <family lang="und-Dsrt">
        <font weight="400" style="normal">NotoSansDeseret-Regular.ttf</font>
    </family>
    <family lang="und-Egyp">
        <font weight="400" style="normal">NotoSansEgyptianHieroglyphs-Regular.ttf</font>
    </family>
    <family lang="und-Glag">
        <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font>
    </family>
    <family lang="und-Goth">
        <font weight="400" style="normal">NotoSansGothic-Regular.ttf</font>
    </family>
    <family lang="und-Hano">
        <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font>
    </family>
    <family lang="und-Armi">
        <font weight="400" style="normal">NotoSansImperialAramaic-Regular.ttf</font>
    </family>
    <family lang="und-Phli">
        <font weight="400" style="normal">NotoSansInscriptionalPahlavi-Regular.ttf</font>
    </family>
    <family lang="und-Prti">
        <font weight="400" style="normal">NotoSansInscriptionalParthian-Regular.ttf</font>
    </family>
    <family lang="und-Java">
        <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font>
    </family>
    <family lang="und-Kthi">
        <font weight="400" style="normal">NotoSansKaithi-Regular.ttf</font>
    </family>
    <family lang="und-Kali">
        <font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font>
    </family>
    <family lang="und-Khar">
        <font weight="400" style="normal">NotoSansKharoshthi-Regular.ttf</font>
    </family>
    <family lang="und-Lepc">
        <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font>
    </family>
    <family lang="und-Limb">
        <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font>
    </family>
    <family lang="und-Linb">
        <font weight="400" style="normal">NotoSansLinearB-Regular.ttf</font>
    </family>
    <family lang="und-Lisu">
        <font weight="400" style="normal">NotoSansLisu-Regular.ttf</font>
    </family>
    <family lang="und-Lyci">
        <font weight="400" style="normal">NotoSansLycian-Regular.ttf</font>
    </family>
    <family lang="und-Lydi">
        <font weight="400" style="normal">NotoSansLydian-Regular.ttf</font>
    </family>
    <family lang="und-Mand">
        <font weight="400" style="normal">NotoSansMandaic-Regular.ttf</font>
    </family>
    <family lang="und-Mtei">
        <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font>
    </family>
    <family lang="und-Talu">
        <font weight="400" style="normal">NotoSansNewTaiLue-Regular.ttf</font>
    </family>
    <family lang="und-Nkoo">
        <font weight="400" style="normal">NotoSansNKo-Regular.ttf</font>
    </family>
    <family lang="und-Ogam">
        <font weight="400" style="normal">NotoSansOgham-Regular.ttf</font>
    </family>
    <family lang="und-Olck">
        <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font>
    </family>
    <family lang="und-Ital">
        <font weight="400" style="normal">NotoSansOldItalic-Regular.ttf</font>
    </family>
    <family lang="und-Xpeo">
        <font weight="400" style="normal">NotoSansOldPersian-Regular.ttf</font>
    </family>
    <family lang="und-Sarb">
        <font weight="400" style="normal">NotoSansOldSouthArabian-Regular.ttf</font>
    </family>
    <family lang="und-Orkh">
        <font weight="400" style="normal">NotoSansOldTurkic-Regular.ttf</font>
    </family>
    <family lang="und-Osma">
        <font weight="400" style="normal">NotoSansOsmanya-Regular.ttf</font>
    </family>
    <family lang="und-Phnx">
        <font weight="400" style="normal">NotoSansPhoenician-Regular.ttf</font>
    </family>
    <family lang="und-Rjng">
        <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font>
    </family>
    <family lang="und-Runr">
        <font weight="400" style="normal">NotoSansRunic-Regular.ttf</font>
    </family>
    <family lang="und-Samr">
        <font weight="400" style="normal">NotoSansSamaritan-Regular.ttf</font>
    </family>
    <family lang="und-Saur">
        <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font>
    </family>
    <family lang="und-Shaw">
        <font weight="400" style="normal">NotoSansShavian-Regular.ttf</font>
    </family>
    <family lang="und-Sund">
        <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font>
    </family>
    <family lang="und-Sylo">
        <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font>
    </family>
    <!-- Esrangela should precede Eastern and Western Syriac, since it's our default form. -->
    <family lang="und-Syre">
        <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.ttf</font>
    </family>
    <family lang="und-Syrn">
        <font weight="400" style="normal">NotoSansSyriacEastern-Regular.ttf</font>
    </family>
    <family lang="und-Syrj">
        <font weight="400" style="normal">NotoSansSyriacWestern-Regular.ttf</font>
    </family>
    <family lang="und-Tglg">
        <font weight="400" style="normal">NotoSansTagalog-Regular.ttf</font>
    </family>
    <family lang="und-Tagb">
        <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font>
    </family>
    <family lang="und-Lana">
        <font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font>
    </family>
    <family lang="und-Tavt">
        <font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font>
    </family>
    <family lang="und-Tibt">
        <font weight="400" style="normal">NotoSansTibetan-Regular.ttf</font>
        <font weight="700" style="normal">NotoSansTibetan-Bold.ttf</font>
    </family>
    <family lang="und-Tfng">
        <font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font>
    </family>
    <family lang="und-Ugar">
        <font weight="400" style="normal">NotoSansUgaritic-Regular.ttf</font>
    </family>
    <family lang="und-Vaii">
        <font weight="400" style="normal">NotoSansVai-Regular.ttf</font>
    </family>
    <family>
        <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font>
    </family>
    <family lang="zh-Hans">
        <font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font>
    </family>
    <!-- TODO: Add Bopo -->
    <family lang="zh-Hant">
        <font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font>
    </family>
    <family lang="ja">
        <font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font>
    </family>
    <family lang="ko">
        <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
    </family>
    <family lang="und-Zsye">
        <font weight="400" style="normal">NotoColorEmoji.ttf</font>
    </family>
    <family lang="und-Zsym">
        <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font>
    </family>
    <!--
        Tai Le, Yi, Mongolian, and Phags-pa are intentionally kept last, to make sure they don't
        override the East Asian punctuation for Chinese.
    -->
    <family lang="und-Tale">
        <font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font>
    </family>
    <family lang="und-Yiii">
        <font weight="400" style="normal">NotoSansYi-Regular.ttf</font>
    </family>
    <family lang="und-Mong">
        <font weight="400" style="normal">NotoSansMongolian-Regular.ttf</font>
    </family>
    <family lang="und-Phag">
        <font weight="400" style="normal">NotoSansPhagsPa-Regular.ttf</font>
    </family>
</familyset>

自定义的Font Family,可以在App的res目录下定义,也可以从远程下载,详细用法可参考:https://developer.android.com/guide/topics/resources/font-resource.html。

1.2 Text Style

android:textStyle:设置Text Style,包括粗体和斜体,属性值可以是normal、bold、italic和bold|italic。

1.3 Typeface

android:typeface:设置Typeface,包括衬线字体、非衬线字体和等宽字体,属性值可以是normal、sans、serif、monospace。

1.4 属性解析过程

下图是TextView解析上面提到的三个属性的过程,最重要的一个类便是Typeface。

在这里插入图片描述

1.5 Typeface

Typeface在初始化时会默认创建几种Typeface,代码如下。

public class Typeface {
    public static final Typeface DEFAULT;
    public static final Typeface DEFAULT_BOLD;
    public static final Typeface SANS_SERIF;
    public static final Typeface SERIF;
    public static final Typeface MONOSPACE;
    static Typeface[] sDefaults;
    static {
        init();
        DEFAULT         = create((String) null, 0);
        DEFAULT_BOLD    = create((String) null, Typeface.BOLD);
        SANS_SERIF      = create("sans-serif", 0);
        SERIF           = create("serif", 0);
        MONOSPACE       = create("monospace", 0);
        sDefaults = new Typeface[] {
            DEFAULT,
            DEFAULT_BOLD,
            create((String) null, Typeface.ITALIC),
            create((String) null, Typeface.BOLD_ITALIC),
        };
    }
}

1.6 Font Matrix

Font涉及几条很重要的线,在FontMetrics中定义,代码如下。

    /**
     * Class that describes the various metrics for a font at a given text size.
     * Remember, Y values increase going down, so those values will be positive,
     * and values that measure distances going up will be negative. This class
     * is returned by getFontMetrics().
     */
    public static class FontMetrics {
        /**
         * The maximum distance above the baseline for the tallest glyph in
         * the font at a given text size.
         */
        public float   top;
        /**
         * The recommended distance above the baseline for singled spaced text.
         */
        public float   ascent;
        /**
         * The recommended distance below the baseline for singled spaced text.
         */
        public float   descent;
        /**
         * The maximum distance below the baseline for the lowest glyph in
         * the font at a given text size.
         */
        public float   bottom;
        /**
         * The recommended additional space to add between lines of text.
         */
        public float   leading;
    }

此外,还包括baseline、mean line和capital line,如下图。

在这里插入图片描述

1.7 style&theme

style和theme是一个相对高级的话题,不用对每个TextView的各个属性逐个进行设置,而是将相关属性通过style或theme指定,详细用法可参考https://developer.android.com/guide/topics/ui/themes.html。

2、Font配置

在Android源码中,主要有两个地方可以配置Font。一个是frameworks/base/data/fonts目录,另一个是externals目录下面的roboto-fonts、google-fonts和noto-fonts。

以frameworks/base/data/fonts目录为例,目录结构如下。

frameworks/base/data/fonts/
├── AndroidClock.ttf
├── Android.mk
├── DroidSansFallbackFull.ttf
├── DroidSansFallback.ttf
├── DroidSansMono.ttf
├── fonts.mk
├── fonts.xml
├── MODULE_LICENSE_APACHE2
├── NOTICE
└── README.txt

Font的打包规则可参考相应的mk文件。

3、Font加载

Zygote在初始化时会preload一些东西,其中preloadClasses中就包括Typeface,哪些Class需要preload,可在/system/etc/preloaded-classes中找到,真正的配置可在frameworks/base/config目录找到。上面提到了,Font在Typeface中加载,整个流程如下图。

在这里插入图片描述

Typeface提供了一组接口用于加载Font,如下。

public static Typeface create(String familyName, int style)
public static Typeface create(Typeface family, int style)
public static Typeface defaultFromStyle(int style)
public static Typeface createFromAsset(AssetManager mgr, String path)
public static Typeface createFromFile(@Nullable File path)
public static Typeface createFromFile(@Nullable String path)

Typeface在Native层通过hwui模块管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值