• RK:android5.1 修改系统默认字体


    https://my.oschina.net/wolfcs/blog/366228?fromerr=RPZf2zmJ  android 5.0中字库文件管理配置的变化

    https://blog.csdn.net/a282255307/article/details/76870441  浅析Android字体加载原理   Leslie_Yu 

    https://www.jianshu.com/p/c5087d5a2268?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation   Android8.1系统字体

    一.Android api  Typeface 字型

    android.graphics.Typeface提供了3个API供应用程序创建特定字体:

    1. Typeface createFromAsset(AssetManager mgr, String path);

    2. Typeface createFromFile(File path);

    3. Typeface createFromFile(String path);

    以及如下3个API来创建系统字体:

    1. Typeface create(String familyName, int style);

    2. Typeface create(Typeface family, int style);

    3. Typeface defaultFromStyle(int style);

    1.ZK_RXXX_RK3288_ANDROID5.1frameworksasegraphicsjavaandroidgraphicsTypeface.java

        static Typeface[] sDefaults;
        private static final LongSparseArray<SparseArray<Typeface>> sTypefaceCache =
                new LongSparseArray<SparseArray<Typeface>>(3);
    
        static Typeface sDefaultTypeface;
        static Map<String, Typeface> sSystemFontMap;
        static FontFamily[] sFallbackFonts;
    
        static final String FONTS_CONFIG = "fonts.xml";
    

    static代码块 初始化系统字体

        static {
            init();
            // Set up defaults and typefaces exposed in public API
            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),
            };
    
        }
    

     init

    /*
     * (non-Javadoc)
     *
     * This should only be called once, from the static class initializer block.
     */
    private static void init() {
        // Load font config and initialize Minikin state
        //获取系统字体配置文件位置放置于system/etc目录下
        File systemFontConfigLocation = getSystemFontConfigLocation();
        //获取配置文件fonts.xml
        File configFilename = new File(systemFontConfigLocation, FONTS_CONFIG);
        //以下代码是对fonts.xml的解析,即是对系统字体的解析
        try {
            FileInputStream fontsIn = new FileInputStream(configFilename);
            FontListParser.Config fontConfig = FontListParser.parse(fontsIn);
    
            Map<String, ByteBuffer> bufferForPath = new HashMap<String, ByteBuffer>();
            //用来承载fonts.xml中的每个family节点
            List<FontFamily> familyList = new ArrayList<FontFamily>();
            // Note that the default typeface is always present in the fallback list;
            // this is an enhancement from pre-Minikin behavior.
            //从每个family节点中解析字体样式,这里解析系统默认字体
            for (int i = 0; i < fontConfig.families.size(); i++) {
                FontListParser.Family f = fontConfig.families.get(i);
                if (i == 0 || f.name == null) {
                    familyList.add(makeFamilyFromParsed(f, bufferForPath));
                }
            }
            //系统默认字体集合
            sFallbackFonts = familyList.toArray(new FontFamily[familyList.size()]);
            //设置默认系统字体
            setDefault(Typeface.createFromFamilies(sFallbackFonts));
            //这里加载系统字体,包括默认字体
            Map<String, Typeface> systemFonts = new HashMap<String, Typeface>();
            for (int i = 0; i < fontConfig.families.size(); i++) {
                Typeface typeface;
                FontListParser.Family f = fontConfig.families.get(i);
                if (f.name != null) {
                    if (i == 0) {
                        // The first entry is the default typeface; no sense in
                        // duplicating the corresponding FontFamily.
                        typeface = sDefaultTypeface;
                    } else {
                        //从每个family节点中解析字体
                        FontFamily fontFamily = makeFamilyFromParsed(f, bufferForPath);
                        FontFamily[] families = { fontFamily };
                        typeface = Typeface.createFromFamiliesWithDefault(families);
                    }
                    //解析的字体添加到系统字体中
                    systemFonts.put(f.name, typeface);
                }
            }
            //通过权重别号解析字体,别名必须与字体对应
            for (FontListParser.Alias alias : fontConfig.aliases) {
                Typeface base = systemFonts.get(alias.toName);
                Typeface newFace = base;
                int weight = alias.weight;
                if (weight != 400) {
                    newFace = new Typeface(nativeCreateWeightAlias(base.native_instance, weight));
                }
                systemFonts.put(alias.name, newFace);
            }
            //系统字体集合
            sSystemFontMap = systemFonts;
    
        } catch (RuntimeException e) {
            Log.w(TAG, "Didn't create default family (most likely, non-Minikin build)", e);
            // TODO: normal in non-Minikin case, remove or make error when Minikin-only
        } catch (FileNotFoundException e) {
            Log.e(TAG, "Error opening " + configFilename, e);
        } catch (IOException e) {
            Log.e(TAG, "Error reading " + configFilename, e);
        } catch (XmlPullParserException e) {
            Log.e(TAG, "XML parse exception for " + configFilename, e);
        }
    }
    

     二.fonts.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!--
        NOTE: this is the newer (L) version of the system font configuration,
        supporting richer weight selection. Some apps will expect the older
        version, so please keep system_fonts.xml and fallback_fonts.xml in sync
        with any changes, even though framework will only read this file.
    
        All fonts withohut 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="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" />
    
        <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 variant="elegant">
            <font weight="400" style="normal">NotoNaskh-Regular.ttf</font>
            <font weight="700" style="normal">NotoNaskh-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoNaskhUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoNaskhUI-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansThai-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansThai-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansDevanagari-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansDevanagari-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font>
        </family>
        <!-- Gujarati should come after Devanagari -->
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansGujarati-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansGujarati-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font>
        </family>
        <!-- Gurmukhi should come after Devanagari -->
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansGurmukhi-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansGurmukhi-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansTamil-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansTamil-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansMalayalam-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansMalayalam-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansBengali-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansBengali-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansTelugu-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansTelugu-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansKannada-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansKannada-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansKhmer-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansKhmer-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansLao-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansLao-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font>
        </family>
        <family variant="elegant">
            <font weight="400" style="normal">NotoSansMyanmar-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansMyanmar-Bold.ttf</font>
        </family>
        <family variant="compact">
            <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansCham-Regular.ttf</font>
            <font weight="700" style="normal">NotoSansCham-Bold.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansYi-Regular.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">Lohit-Odia.ttf</font>
        </family>
        <family lang="zh-Hans">
            <font weight="400" style="normal">NotoSansHans-Regular.otf</font>
        </family>
        <family lang="zh-Hant">
            <font weight="400" style="normal">NotoSansHant-Regular.otf</font>
        </family>
        <family lang="ja">
            <font weight="400" style="normal">NotoSansJP-Regular.otf</font>
        </family>
        <family lang="ko">
            <font weight="400" style="normal">NotoSansKR-Regular.otf</font>
        </family>
        <family>
            <font weight="400" style="normal">NanumGothic.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">NotoColorEmoji.ttf</font>
        </family>
        <family>
            <font weight="400" style="normal">DroidSansFallback.ttf</font>
        </family>
        <family lang="ja">
            <font weight="400" style="normal">MTLmr3m.ttf</font>
        </family>
        <!--
            Noto Sans Tai Le is intentionally kept last, to make sure it doesn't override
            the East Asian punctuation for Chinese.
        -->
        <family>
            <font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font>
        </family>
    </familyset>
    

      开头注释:暂时为保持兼容性 会保留老的字库配置文件  system_fonts.xml和fallback_fonts.xml 。并且要保持system_fonts.xml和fallback_fonts.xml同步。

      对于任何更改,即使框架将只读取此文件。所有有名称的字体都添加到默认列表中。

    三.Android5.1 修改系统默认字体,系统默认字体样式

    diff --git a/frameworks/base/data/fonts/fonts.xml b/frameworks/base/data/fonts/fonts.xml
    old mode 100644
    new mode 100755
    index 37527e9..892a982
    --- a/frameworks/base/data/fonts/fonts.xml
    +++ b/frameworks/base/data/fonts/fonts.xml
    @@ -16,13 +16,25 @@
         paired with the 500 weight, ensuring adequate contrast.
     -->
     <familyset version="22">
    +<family lang="zh-Hans">
    +        <font weight="400" style="normal">hifont.ttf</font>
    +    </family>
    +    <family lang="zh-Hant">
    +        <font weight="400" style="normal">hifont.ttf</font>
    +    </family>
    +    <family lang="ja">
    +        <font weight="400" style="normal">hifont.ttf</font>
    +    </family>
    +    <family lang="ko">
    +        <font weight="400" style="normal">hifont.ttf</font>
    +    </family>
         <!-- 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="normal">Roboto-Black.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>
    

      

  • 相关阅读:
    Activity的几种启动模式
    android 环境搭建
    认识python中__name__、程序主入口
    32位与64位之谈
    shell中字符串基本用法
    C++ push方法与push_back方法
    8-10总结
    第九章 硬件抽象层:HAL
    第十章 嵌入式Linux的调试技术
    第八章
  • 原文地址:https://www.cnblogs.com/crushgirl/p/13853078.html
Copyright © 2020-2023  润新知