Android8.1系统字体

需求:替换系统字体

分析:

过程: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  才是默认的自体文件

        Roboto-Thin.ttf

        Roboto-ThinItalic.ttf

        Roboto-Light.ttf

        Roboto-LightItalic.ttf

        Roboto-Regular.ttf

        Roboto-Italic.ttf

        Roboto-Medium.ttf

        Roboto-MediumItalic.ttf

        Roboto-Black.ttf

        Roboto-BlackItalic.ttf

        Roboto-Bold.ttf

        Roboto-BoldItalic.ttf

   



其中要注意ttc文件

```

1234

```

        NotoSansCJK-Regular.ttc

   

   

   

        NotoSansCJK-Regular.ttc

   

   

        NotoSansCJK-Regular.ttc

   

   

        NotoSansCJK-Regular.ttc

   

```

你可能感兴趣的:(Android8.1系统字体)