android多字体切换

一、 添加字库
1.把对应的字库文件拷贝到 frameworks/base/data/fonts 下

2.修改 fonts.mk (frameworks/base/data/fonts)

+++ b/frameworks/base/data/fonts/fonts.mk
@@ -48,3 +48,4 @@ PRODUCT_PACKAGES := \
     AndroidClock.ttf \
     AndroidClock_Highlight.ttf \
     AndroidClock_Solid.ttf \
+    DFPShaoNvW5-GB.ttf \
3.修改 android.mk

+++ b/frameworks/base/data/fonts/Android.mk
@@ -139,6 +139,7 @@ font_src_files += \
     DroidSansHebrew-Bold.ttf \
     DroidSansArmenian.ttf \
     DroidSansGeorgian.ttf \
+    DFPShaoNvW5-GB.ttf      \
     AndroidEmoji.ttf
二、修改 ttf 加载路径
修改skia/src/ports/SkFontConfigInterface_android.cpp

 #include <string.h>
+#include <cutils/properties.h>
 
 #ifndef SK_DEBUG_FONTS
     #define SK_DEBUG_FONTS 0
@@ -174,13 +175,25 @@ static bool has_font(const SkTArray<FontRec>& array, const SkString& filename) {
 #endif
 
 static void get_path_for_sys_fonts(SkString* full, const char name[]) {
-    if (gTestFontFilePrefix) {
+       static char args[PROPERTY_VALUE_MAX];
+       property_get("persist.sys.usedmyfont", args, "default");
+       //
+       if (gTestFontFilePrefix) {
         full->set(gTestFontFilePrefix);
     } else {
         full->set(getenv("ANDROID_ROOT"));
         full->append(SK_FONT_FILE_PREFIX);
     }
-    full->append(name);
+//    full->append(name);
+       if(strstr(args, "hksv")){
+                       full->append("DFPShaoNvW5-GB.ttf");
+       }else
+               full->append(name);
 }
三、 实现上层切换功能

1、上层 app( 比如 setting) 实现可以切换字体的 ui 选项。
2、需要定义个配置变量 persist.sys.usedmyfont(例如:system.prop):
当字体切换到默认字体时 SystemProperties.set("persist.sys.usedmyfont", "default");
当使用其它字体时,如华康少女 SystemProperties.set("persist.sys.usedmyfont", "hksv");
3、因为这个功能是要重新加载字库文件,因此必须要实现切换字体后要重启手机功能。
4、如果要是实现单个字体切换只需相应修改 getFullPathForSysFonts 这函数以及persist.sys.usedmyfont 值即可



posted on 2014-08-21 13:43  小尾巴猴子  阅读(427)  评论(0编辑  收藏  举报

导航