android8.1字体,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

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在推上fo了个toefl单词机器人,没想到很多单词的音标显示成了小方块,那就是android默认的英文字体对某些英语国际音标不支持了,当然我的Galaxy S刷了第三方ROM的,不过从网上的帖子来看,官方的字体存在一样的问题,总而言之是字体的问题了。 也搜了一些帖子,但没有很好的解决方案,默认的英文字体还是挺美观的,只是某些英语音标的编码位上缺失了相应的字符而已,Anroid使用Java作为默认开发环境,那默认的字体也应该是使用UNICODE UCS编码的,事实证明的却如此。那就很简单了,强大的字体编辑工具FontForge派上用场了。 Ubuntu仓库里面的版本太低了,可以使用GetDeb仓库来安装最新版本的FontForge。用FontForge打开Android默认的英文字体DroidSans.ttf,果然国际音标编码区域空空如也,英语音标现实不完全也就一点儿也不奇怪了。从国际音标wiki上查找到了这写符号的UNICODE编码,从DejaVuSerif.ttf和Gothic.ttf这两个字体里面提取了对应的字形(glyph)插入到DroidSans.ttf相应的BMP(Basic Multilingual Plane)编码位上。当然只补充了英语音标会用到的字符,包括ɑ,ɒ,ɔ,ə,ɛ,ɜ,ɪ,ɵ,ʃ,ʌ,ʒ,ʤ,ʦ,ʧ这几个常用音标字符。默认的字体竟然连重音(primary stress)和次重音(Secondary stress)这两个符号都没有,一并补齐了。 将制作好的字体覆盖Android默认英文字体/system/fonts/DroidSans.ttf,当然需要root权限,再看英语音标,显示的相当完美了,google dictionary里面的音标也完全没有问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值