安卓手机字体ttf怎么用(最火免费手机字体软件)
程序员文章站
2023-11-27 10:32:52
osg默认只能显示英文和数字字符,如果想显示汉字的话必须加载中文字库,目前osg只支持ttf格式的字库。添加freetype插件库首先在android.mk文件里添加对freetype库的支持,找到l...
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指定字体文件的路径,这样代码更简洁些。
实际效果