osg默认只能显示英文和数字字符,如果想显示汉字的话必须加载中文字库,目前osg只支持ttf格式的字库。
首先在企业网络营销方案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里添加插件:
u_osgplugin(freetype)
先从网上下载或从windows里复制一份ttf文件到项目的asts目录下。然后在运行时将此文件复制到项目所在的内部存储的路径下,并把路径通过ndk传给osg,以便于osg通过c++代码加载字体文件。
在osgnativelib.java最后添加:
public static native void tlocalfont(string fontname);
在mainactivity里实现字体文件的复制功能
private val fontname = "fangsong_gb2312.ttf"privat白糖的功效与作用e val fontfile by lazy { filesdir.path + fi三民主义是什么le.parator + fontname }private fun checklocalfont() { if (!file(fontfile).exists()) { try { val fis = resources.asts.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.tlocalfont(fontfile)}
上述代码是在android层面拿到字体位于项目所在的路径,现在需要把这个路径传给osgnativelib.cpp
...jniexport void jnicalljava_osg_androidexample_osgnativelib_tlocalfont(jnienv *env, jobject obj, jstring fontname);...extern "c" jniexport void jnicalljava_osg_androidexample_osgnativelib_tlocal使徒行者第三部 电视剧font(jnienv *env, jobject obj, jstring fontname) { const char *lfont = env->getstringutfchars(fontname, jni_fal); mainapp.tlocalfont(std::string(lfont)); //relea strings to jni env->releastringutfchars(fontname, lfont);}
由于ndk只支持c语言的语法,所以osgnativelib还要再二传手,把路径传给osgmainapp,一般来说这个文件才是我们osg的起始文件。
// osgmainapp.hppvoid addtext(const std::string & font);//osgmainapp.cppvoid osgmainapp::addtext(const std::string & font) { tlocale(lc_all, ".936"); //等价tlocale(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->tfont(fonthz); text->ttext(str, osgtext::string::encoding_utf8); text->tcharactersize(40.0f); text->tposition(osg::vec3( 0.0, 0.0, 0.0f)); text->tautorotatetoscreen( true); root->addchild(text);}
readreffontfile就是读取字体文件并返回一个字体类型的指针,然后通过tfont设置这个字体指针,如果我们没有在项目中引入freetype的插件库的话,readreffontfile就直接返回一个null。
如果不需要操作字体指针的话可以直接在tfont指定字体文件的路径,这样代码更简洁些。
实际效果
本文发布于:2023-04-05 06:51:46,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1da4879a286e773b4e2068830df80a6b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:安卓手机字体ttf怎么用(最火免费手机字体软件).doc
本文 PDF 下载地址:安卓手机字体ttf怎么用(最火免费手机字体软件).pdf
留言与评论(共有 0 条评论) |