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

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

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

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

实际效果

看完文章,还可以用支付宝扫描下面的二维码领取一个支付宝红包,目前可领1-88元不等

支付宝红包二维码

除了扫码可以领取之外,大家还可以(复制 720087999 打开✔支付宝✔去搜索, h`o`n.g.包哪里来,动动手指就能领)。

看下图所示是好多参与这次活动领取红包的朋友:

支付宝红包

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

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

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

分享给朋友:

相关文章

想去丽江旅游,可是又怕得肺炎,只能手机上看看了
想去丽江旅游,可是又怕得肺炎,只能手机上看看了

最近天天刷抖音刷到丽江的景区,其中看到最多的就是丽江古城,好多导游都会介绍半天时间,那个丽江古城的街道看的我都快“流口水”了,真的太美了,下面给大家看下我用手机截图的一张丽江古城网红打卡点:看到这张图是不是感觉好美呢?这个就是丽江古城网红打...

最傻的六种员工离职理由,希望你不是其中一员
最傻的六种员工离职理由,希望你不是其中一员

春节后,今年的中国员工离职率应该是最低的。但是职场上,还是会有很多员工提离职。离职原因各种各样, 不开心,不舒服,工资少,学不到东西等等。那么,最傻的六种员工离职是哪些呢?一、新领导到来有些员工习惯了以前的领导的工作方式,怕自己不适应新领导...

谈2022年平衡发展策略,我们要平衡的发展
谈2022年平衡发展策略,我们要平衡的发展

2022年解决方案的第二个关键词叫平衡。我们要平衡的发展,长期的发展。你的个人生活,你的公司事业,还有国家的形势,我觉得一定要平衡的去发展,不能说我只赚钱,身体就搞垮,或者说我只赚快钱,但是不关心国家的形势。你看,密室逃脱这个行业,上周国家...

g系列cpu性能排行(英特尔u系列和g系列)
g系列cpu性能排行(英特尔u系列和g系列)

去年10月,AMD正式发布Zen 3架构锐龙5000系列处理器,单线程和多线程性能实现“质”的飞跃,反超当时的10代酷睿处理器,与后来发布的11代酷睿处理器相比,也丝毫不落于下风。 在这样的大前提下,AMD于4月发布了Zen 3架构锐龙...

这4类项目,投资人打死都不想投
这4类项目,投资人打死都不想投

很多创业者常感慨:明明自己的项目很好,但聊了很多投资人,却没人愿意投,这是为什么呢? 我们知道融资成功的关键,在于要让投资人看到项目的价值。这个价值,不仅仅是你的项目好就行,除了项目本身,投资人还有很多关注点,如果这些地方不“达标”,投资...

hcie面试通过率是多少(华为hcip认证费用和报名资格)

华为hcie面试通过率是多少? 华为官方公开披露的数据为30%,也就是说十个人中仅有三个可以通过,成为华为专家级网络工程师。从59学习网站长所接触考生的实际情况来看,通过率至少也是五五开,大于50%,因此不必过于担心。 HCIE面试考点涵盖...