美文网首页
Android8.1系统字体

Android8.1系统字体

作者: King_Karl | 来源:发表于2018-11-07 10:15 被阅读0次

需求:替换系统字体

分析:

过程:frameworks/base/data/fonts/fonts.xml

            external/roboto-fonts/

            noto-fonts/other/

关于字体上层主要在 

frameworks/base/graphics/java/android/graphics/Typeface.java

static {

final ArrayMap systemFontMap =new ArrayMap<>();

final ArrayMap systemFallbackMap =new ArrayMap<>();

buildSystemFallback("/system/etc/fonts.xml","/system/fonts/", systemFontMap,

systemFallbackMap);

sSystemFontMap = Collections.unmodifiableMap(systemFontMap);

sSystemFallbackMap = Collections.unmodifiableMap(systemFallbackMap);

setDefault(sSystemFontMap.get(DEFAULT_FAMILY));

// 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),

};

}

static代码块 是系统typeface的初始化

DEFAULT 、DEFAULT_BOLD 、SANS_SERIF、SERIF、MONOSPACE

因为DEFAULT_FAMILY ="sans-serif"  所以DEFAULT = SANS_SERIF    DEFAULT_BOLD = SANS_SERIF + BOLD

所以先介绍下三种familyName的含义

sans-serif:区别于“serif”,没有"笔锋",笔画粗细也基本差不多

serif:带“笔锋”,而且根据横竖斜的宽度也不一样

monospace:打印用字体,属于“sans-serif”,每个字母等间距

其次介绍下"font-weight",

weight指的是粗细”

那么默认的weight是多少?

===>>>Typeface.java 

create(null,0);

nativeCreateFromTypeface(ni, style)

===>>>Typeface.cpp

frameworks/base/core/jni/android/graphics/Typeface.cpp

Typeface* face = Typeface::createRelative(family, (SkTypeface::Style)style);

===>>>Typeface.cpp

frameworks/base/libs/hwui/hwui/Typeface.cpp

Typeface* Typeface::createRelative(Typeface* src, SkTypeface::Style style) {

    Typeface* resolvedFace = Typeface::resolveDefault(src);

Typeface* hwTypeface = new Typeface();

    hwTypeface->fFontCollection = collection;

    hwTypeface->fSkiaStyle = SkTypeface::kNormal;

    hwTypeface->fBaseWeight = SkFontStyle::kNormal_Weight;

    hwTypeface->fStyle = minikin::FontStyle(4 /* weight */, false /* italic */);

    Typeface::setDefault(hwTypeface);

===>>>SkFontStyle.h

external/skia/include/core/SkFontStyle.h

enum Weight {

        kInvisible_Weight  =    0,

        kThin_Weight        =  100,

        kExtraLight_Weight  =  200,

        kLight_Weight      =  300,

        kNormal_Weight      =  400,

        kMedium_Weight      =  500,

        kSemiBold_Weight    =  600,

        kBold_Weight        =  700,

        kExtraBold_Weight  =  800,

        kBlack_Weight      =  900,

        kExtraBlack_Weight  = 1000,

    };

所以默认的weight是400

再根据frameworks/base/data/fonts/fonts.mk    找到Roboto-Regular.ttf  才是默认的自体文件

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

其中要注意ttc文件

```

1234

```

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

```

相关文章

网友评论

      本文标题:Android8.1系统字体

      本文链接:https://www.haomeiwen.com/subject/siumxqtx.html