登录|注册|帮助中心|联系我们

导航
首页 综合百科 生活常识 数码科技 明星名人 传统文化 互联网 健康 影视 美食 教育 旅游 汽车 职场 时尚 运动 游戏 家电 地理 房产 金融 节日 服饰 乐器 歌曲 动物 植物
当前位置:首页 > 数码科技

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

发布时间:2023年1月5日责任编辑:李小芳标签:软件免费安卓手机

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 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指定字体文件的路径,这样代码更简洁些。

实际效果

其它知识推荐

溜溜百科知识网——分享日常生活学习工作各类知识。 垃圾信息处理邮箱 tousu589@163.com
icp备案号 闽ICP备14012035号-2 互联网安全管理备案 不良信息举报平台 Copyright 2023 www.6za.net All Rights Reserved