安卓手机字体ttf怎么用(最火免费手机字体软件)

2022-07-18,,,

osg默认只能显示英文和数字字符,如果想显示汉字的话必须加载中文字库,目前osg只支持ttf格式的字库。

添加freetype插件库

首先在android.mk文件里添加对freetype库的支持,找到local_ldflags项并在最后添加以下两行:

local_ldflags   := -l $(libdir) 
...
-l$(osg_android_dir)/lib/osgplugins-3.6.5/libosgdb_freetype.a 
-l$(osg_android_dir)/obj/local/armeabi-v7a/libft2.a

然后在找在osgmainapp.hpp里添加插件:

use_osgplugin(freetype)

在项目中设置ttf字库文件

先从网上下载或从windows里复制一份ttf文件到项目的assets目录下。然后在运行时将此文件复制到项目所在的内部存储的路径下,并把路径通过ndk传给osg,以便于osg通过c++代码加载字体文件。

在osgnativelib.java最后添加:

public static native void setlocalfont(string fontname);

在mainactivity里实现字体文件的复制功能

private val fontname = "fangsong_gb2312.ttf"

private val fontfile by lazy { filesdir.path + file.separator + fontname }

private fun checklocalfont() {
    if (!file(fontfile).exists()) {
        try {
            val fis = resources.assets.open("font/$fontname")
            fis.copyto(fileoutputstream(fontfile), 1024 * 6)
        } catch (e: ioexception) {
            e.printstacktrace()
        }
    }
}

override fun oncreate(savedinstancestate: bundle?) {
    super.oncreate(savedinstancestate)
    ...
    checklocalfont()
    ...
    //建议在osg初始化完成后调用
    osgnativelib.setlocalfont(fontfile)
}

上述代码是在android层面拿到字体位于项目所在的路径,现在需要把这个路径传给osgnativelib.cpp

...
jniexport void jnicall
java_osg_androidexample_osgnativelib_setlocalfont(jnienv *env, jobject obj, jstring fontname);
...
extern "c" jniexport void jnicall
java_osg_androidexample_osgnativelib_setlocalfont(jnienv *env, jobject obj, jstring fontname) {
    const char *lfont = env->getstringutfchars(fontname, jni_false);
    mainapp.setlocalfont(std::string(lfont));
    //release strings to jni
    env->releasestringutfchars(fontname, lfont);
}

由于ndk只支持c语言的语法,所以osgnativelib还要再二传手,把路径传给osgmainapp,一般来说这个文件才是我们osg的起始文件。

// osgmainapp.hpp
void addtext(const std::string & font);

//osgmainapp.cpp
void osgmainapp::addtext(const std::string & font) {
    setlocale(lc_all, ".936");
    //等价setlocale(lc_all, "chs");
    std::string str =  "osg for android 中文显示示例";
    osg::ref_ptr<osgtext::text> text =  new osgtext::text;
    osg::ref_ptr<osgtext::font> fonthz = osgtext::readreffontfile(font);
    text->setfont(fonthz);
    text->settext(str, osgtext::string::encoding_utf8);
    text->setcharactersize(40.0f);  
    text->setposition(osg::vec3( 0.0, 0.0, 0.0f));
    text->setautorotatetoscreen( true);
    root->addchild(text);
}

readreffontfile就是读取字体文件并返回一个字体类型的指针,然后通过setfont设置这个字体指针,如果我们没有在项目中引入freetype的插件库的话,readreffontfile就直接返回一个null。
如果不需要操作字体指针的话可以直接在setfont指定字体文件的路径,这样代码更简洁些。

实际效果

《安卓手机字体ttf怎么用(最火免费手机字体软件).doc》

下载本文的Word格式文档,以方便收藏与打印。