时间:2024-01-24人气:作者:未知
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里添加插件:
USE_OSGPLUGIN(freetype)
先从网上下载或从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 JNICALLJava_osg_AndroidExample_osgNativeLib_setLocalFont(JNIEnv *env, jobject obj, jstring fontName);...extern "C" JNIEXPORT void JNICALLJava_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.hppvoid addText(const std::string & font);//OsgMainApp.cppvoid 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指定字体文件的路径,这样代码更简洁些。
实际效果
ps:【项目】淘宝项目邀请用户即可获取收益
ps:【活动】支付宝大额红包点击扫码领取
ps:【本站主题】自适应资讯类的网站主题
1、网格员是运用现代城市网络化管理技术,巡查、核实、上报、处置市政工程(公用)设施、市容环境、社会管理事务等方面的问题,并对相关信息进行采集、分析、处置的人员。2、城市网格化管理,是将城市管理辖区按照一定的标准划分成为单
(0)人喜欢2024-06-27金骏眉是什么茶(红茶金骏眉适合哪些人喝)金骏眉茶,属于红茶中正山小种的分支,原产于福建省武夷山市桐木村。金骏眉之所以名贵,是因为全程都由制茶师傅手工制作,每500g金百思特网骏眉需要数万颗的茶叶鲜芽尖
(0)人喜欢2024-06-27常州有什么好玩的地方(到常州旅游千万不要错过这些景点)常州地处江苏省南部、长三角腹地。三吴重镇,八邑名都,季子故里,常州这座文化古城可谓人杰地灵,人文荟萃。常州拥有超过2500年的历史,是长江文明和吴
(0)人喜欢2024-06-27优美的句子摘抄(高级有质感的唯美句子)一、人越长大就越能明白,爱不爱是其次,相处不累才最重要。二、每个人能付出的爱百思特网都是有限的,无论是对朋友还是爱人,如果你让我感觉到力不从心了,我可以惯着你,也
(0)人喜欢2024-06-271、网格员是运用现代城市网络化管理技术,巡查、核实、上报、处置市政工程(公用)设施、市容环境、社会管理事务等方面的问题,并对相关信息进行采集、分析、处置的人员。2、城市网格化管理,是将城市管理辖区按照一定的标准划分成为单
(0)人喜欢2024-06-27金骏眉是什么茶(红茶金骏眉适合哪些人喝)金骏眉茶,属于红茶中正山小种的分支,原产于福建省武夷山市桐木村。金骏眉之所以名贵,是因为全程都由制茶师傅手工制作,每500g金百思特网骏眉需要数万颗的茶叶鲜芽尖
(0)人喜欢2024-06-27常州有什么好玩的地方(到常州旅游千万不要错过这些景点)常州地处江苏省南部、长三角腹地。三吴重镇,八邑名都,季子故里,常州这座文化古城可谓人杰地灵,人文荟萃。常州拥有超过2500年的历史,是长江文明和吴
(0)人喜欢2024-06-27优美的句子摘抄(高级有质感的唯美句子)一、人越长大就越能明白,爱不爱是其次,相处不累才最重要。二、每个人能付出的爱百思特网都是有限的,无论是对朋友还是爱人,如果你让我感觉到力不从心了,我可以惯着你,也
(0)人喜欢2024-06-27