当前位置:首页 > 谈天说地

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

34资源网2021-12-061276

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

实际效果

版权声明:34楼发布

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

分享给朋友:

相关文章

木村久一:所谓天才人物指的就是具有毅力的人、勤奋的人、入迷的人和忘我的人

木村久一:所谓天才人物指的就是具有毅力的人、勤奋的人、入迷的人和忘我的人

木村久一:所谓天才人物指的就是具有毅力的人、勤奋的人、入迷的人和忘我的人。…

低成本创业好项目,这个可日赚几千元

低成本创业好项目,这个可日赚几千元

这几年创业项目也变得越来越多了,大家都知道,现在靠打工是挣不了什么钱的,所以,很多人宁愿自己创业不想打工。那么,低成本创业项目有哪些呢?下面小编马上为大家推荐一个低成本创业项目,如果你有资源的话,也可以免费去推广操作,做好了日赚几千也是很容…

苹果X快充PD充电器推荐,现在下载还有优惠券可以领呢

苹果X快充PD充电器推荐,现在下载还有优惠券可以领呢

现在有很多人用的是苹果手机,因为平时有些人不注意使用方式或者使用充电器比较频繁导致损坏。大家都知道苹果手机和安卓手机的充电器是不一样的,不能用安卓手机的充电器充苹果手机。所以,大家如果苹果手机充电器损坏了,需要购买的话就要买个专门的苹果手机…

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

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

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

短视频文案素材哪里找(上热门的短视频素材)

短视频文案素材哪里找(上热门的短视频素材)

抖音怎么写文案?整理了100条抖音抖音爆款文案,直接套用就能火…

哪家的云主机好(国内五大云主机服务商)

哪家的云主机好(国内五大云主机服务商)

导言:博睿数据(股票代码688229)十余年专注APM领域,已为超过2000余家大型企业提供专业数据服务。依托先进的测评技术及丰富的行业经验,博睿宏远倾力打造了一个公开透明的性能测评栏目——【Bonree指数】。该栏目致力于呈现各行业的整体…