【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模塊管理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章