如何实现字体切换功能
时间:10-02
整理:3721RD
点击:
一、实现单个字体切换
可以参考DMS文档:Font Install and Runtime Change On ICS guideline.doc
二、多个字体(多个字体一套风格,比如泰语字库、英文字库)
实现这个功能其实是采用了系统在加载字体时会为每个字体指定加载路径的原理,只要把我们要替
换的字库文件编译到系统目录下,然后修改要替换的字体的路径就可实现这一功能。
1、添加字库
1)把对应的字库文件拷贝到php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks/base/data/fonts下
2)修改fonts.mk (frameworks/base/data/fonts)
a、ICS
PRODUCT_COPY_FILES := \
......
frameworks/base/data/fonts/NewFontFile.ttf:system/fonts/DroidSansThai-My.ttf \
frameworks/base/data/fonts/NewFontFile.ttf:system/fonts/ Roboto-Regular-My.ttf \
b、JB
PRODUCT_PACKAGES:= \
DroidSansThai-My.ttf \
Roboto-Regular-My.ttf \
......
4)对于JB2,JB3,JB5,kk还需修改android.mk
ifeq ($(MINIMAL_FONT_FOOTPRINT),true)
……
else # !MINIMAL_FONT
font_src_files +=
……
DroidSansThai-My.ttf \
Roboto-Regular-My.ttf \
5)对于GB版本只需修改Android.mk
copy_fROM := \
DroidSansThai-My.ttf \
Roboto-Regular-My.ttf \
……
注:请不要修改fallback_fonts.xml等xml文件,这个添加仅仅是让系统把字库编译到fonts目下。
2、修改ttf加载路径
#include <cutils/properties.h>//引入头文件
SkFontHost_android.cpp(alps\external\skia\src\ports)
static void getFullPathForSysFonts(SkString* full, const char name[]) {
static char args[PROPERTY_VALUE_MAX];//定义变量
property_get("persist.sys.usedmyfont", args, "no");//获取persist.sys.usedmyfont配置
full->set(getenv("ANDROID_root"));
full->append(SK_FONT_FILE_PREFIX);
if(strstr(args,"yes")){
if(strstr(name,"DroidSansThai")){
full->append("DroidSansThai-My.ttf");
}else if(strstr(name,"Roboto-Regular")){
full->append("Roboto-Regular.ttf");
}else{
full->append(name);
}
}else{
full->append(name);
}
}
kk版本文件路径:
SkFontConfigInterface_android.(external\skia\src\ports)
3、实现上层切换功能
因为这一步比较容易实现,且不同需求ui设计不同,因此此步骤只提供大概思路,没有具体实现。
1)上层app(比如setting)实现可以切换字体的ui选项。
2)需要定义个配置变量persist.sys.usedmyfont:
当字体切换时SystemProperties.set("persist.sys.usedmyfont", "yes");
当使用默认字体时SystemProperties.set("persist.sys.usedmyfont", "no");
3) 因为这个功能是要重新加载字库文件,因此必须要实现切换字体后要重启手机功能
可以参考DMS文档:Font Install and Runtime Change On ICS guideline.doc
二、多个字体(多个字体一套风格,比如泰语字库、英文字库)
实现这个功能其实是采用了系统在加载字体时会为每个字体指定加载路径的原理,只要把我们要替
换的字库文件编译到系统目录下,然后修改要替换的字体的路径就可实现这一功能。
1、添加字库
1)把对应的字库文件拷贝到php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks/base/data/fonts下
2)修改fonts.mk (frameworks/base/data/fonts)
a、ICS
PRODUCT_COPY_FILES := \
......
frameworks/base/data/fonts/NewFontFile.ttf:system/fonts/DroidSansThai-My.ttf \
frameworks/base/data/fonts/NewFontFile.ttf:system/fonts/ Roboto-Regular-My.ttf \
b、JB
PRODUCT_PACKAGES:= \
DroidSansThai-My.ttf \
Roboto-Regular-My.ttf \
......
4)对于JB2,JB3,JB5,kk还需修改android.mk
ifeq ($(MINIMAL_FONT_FOOTPRINT),true)
……
else # !MINIMAL_FONT
font_src_files +=
……
DroidSansThai-My.ttf \
Roboto-Regular-My.ttf \
5)对于GB版本只需修改Android.mk
copy_fROM := \
DroidSansThai-My.ttf \
Roboto-Regular-My.ttf \
……
注:请不要修改fallback_fonts.xml等xml文件,这个添加仅仅是让系统把字库编译到fonts目下。
2、修改ttf加载路径
#include <cutils/properties.h>//引入头文件
SkFontHost_android.cpp(alps\external\skia\src\ports)
static void getFullPathForSysFonts(SkString* full, const char name[]) {
static char args[PROPERTY_VALUE_MAX];//定义变量
property_get("persist.sys.usedmyfont", args, "no");//获取persist.sys.usedmyfont配置
full->set(getenv("ANDROID_root"));
full->append(SK_FONT_FILE_PREFIX);
if(strstr(args,"yes")){
if(strstr(name,"DroidSansThai")){
full->append("DroidSansThai-My.ttf");
}else if(strstr(name,"Roboto-Regular")){
full->append("Roboto-Regular.ttf");
}else{
full->append(name);
}
}else{
full->append(name);
}
}
kk版本文件路径:
SkFontConfigInterface_android.(external\skia\src\ports)
3、实现上层切换功能
因为这一步比较容易实现,且不同需求ui设计不同,因此此步骤只提供大概思路,没有具体实现。
1)上层app(比如setting)实现可以切换字体的ui选项。
2)需要定义个配置变量persist.sys.usedmyfont:
当字体切换时SystemProperties.set("persist.sys.usedmyfont", "yes");
当使用默认字体时SystemProperties.set("persist.sys.usedmyfont", "no");
3) 因为这个功能是要重新加载字库文件,因此必须要实现切换字体后要重启手机功能
签到
