文章插图
文章插图
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 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 JNIenv->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指定字体文件的路径,这样代码更简洁些 。【安卓手机ttf字体下载 安卓ttf字体怎么使用】实际效果
- 苹果系统怎么降级版本 苹果手机怎么用手机降级系统版本
- 怎样切换阿里巴巴账号 手机阿里巴巴怎么切换账号登陆
- 苹果手机如何更改id账号密码 苹果手机id账号怎么修改密码
- app用什么技术开发 手机app开发需要什么技术
- 华为原装屏多少钱一个 怎么查华为手机屏幕价格
- 苹果跟三星哪个好用 苹果手机三星手机哪个更好用
- iphone怎样返回上一级 小技巧 苹果手机怎么返回上一级?
- 苹果手机怎么打特殊符号和文字 文字特殊符号怎么打出来
- 唱歌用什么手机音质好2021 唱歌哪个手机音质好
- 中兴智能手机质量怎么样 中兴手机口碑怎么样