当前位置:首页 > 谈天说地 > 正文内容

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

34资源网2021年12月06日 11:08777

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

实际效果

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/2840.html

相关文章

最近北京疫情怎么样了?最新涉及单位聚集性疫情14起
最近北京疫情怎么样了?最新涉及单位聚集性疫情14起

最近我很关注北京的疫情情况,因为那里有我的亲人。相信大家和我一样,都在关注北京疫情每日新增情况,很多人甚至预测北京很可能会出现当初武汉的局面。6月份在疫情严峻时,北京7天新增157病例,那么在这之后疫情是否得到控制了呢?截至7月12日,北京...

打工人是什么梗出自哪里?打工人的梗为什么这么火?
打工人是什么梗出自哪里?打工人的梗为什么这么火?

近日,看到打工人这词很火,很多小伙伴肯定和我一样,都想知道“打工人”这个词为什么这么火吧?那么,接下来我就跟大家说说打工人是什么梗出自哪里?这词出自哪里无从考证,不过肯定是某些有头脑的网友发明的,至于出自哪位网友?我们一起来了解相关情况吧。...

单身想找个女朋友,男的去哪里可以找个女朋友
单身想找个女朋友,男的去哪里可以找个女朋友

现在中国的男女比例失调,男的光棍要比女的多出3000w以上,这是个什么概念?代表着有3000w人是找不到对象的。所以很多单身男的就开始发愁了,单身想找个女朋友究竟到哪里找呢?说实话,小编也是一名单身汉,也正在找女朋友,虽然说,我没有找到女朋...

逍遥手机模拟器怎么用(逍遥安卓模拟器详细使用教程)
逍遥手机模拟器怎么用(逍遥安卓模拟器详细使用教程)

真正的5V5公平竞技对战,传承端游纯正体验。人气英雄,经典还原;公平竞技,实力至上;峡谷传说,掌心再现。策略、战术、意识、配合,在移动端重现峡谷战场乐趣。 为了庆祝大家期待已久的中国区开服,官方也带来了五大福利活动,用户可免费参与,并获...

融资丨「PPIO边缘云」完成亿元A1轮融资,刷新边缘云领域融资记录
融资丨「PPIO边缘云」完成亿元A1轮融资,刷新边缘云领域融资记录

创业邦获悉,近日,边缘云公司PPIO宣布完成过亿元A1轮融资,由创世伙伴、张江科投、磐霖资本等多家机构联合投资,Pre-A轮投资方蓝驰创投、沸点资本及华业天成继续追加投资,光源资本担任融资财务顾问。这是公司半年内再次获投资人支持,公司A2...

刘强东章泽天携手布局,“大厂”为何掀起私募热潮?
刘强东章泽天携手布局,“大厂”为何掀起私募热潮?

编者按:本文来自雷达财经(ID:leidacj),创业邦经授权发布。 作者|张凯旌 编辑|深海 京东在私募股权投资上又有新动作。 11月29日,由刘强东、章泽天、李瑞玉共同持股的海南三亚天博产业私募基金管理有限公司(下称“海南天...