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

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

34资源网2021-12-061001

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

分享给朋友:

相关文章

做人不能太较真,太较真了你就输了

做人不能太较真,太较真了你就输了

做人做事,有些人会很较真,而有些人则会装的糊涂点,活得自在一点,活得随性一点,睁一只眼闭一只眼过日子,这既是放过了自己也是放过了他人。但凡看看那些跟别人太过于斤斤计较的人,多半活得不开心,活得比较心累和心塞。…

分享10句用哀鸿遍野造句大全

分享10句用哀鸿遍野造句大全

1、在旧社会,每逢水旱战乱,人民就被迫四处逃亡,哀鸿遍野,一片凄凉。…

视频号入口在哪里(视频号直播入口新手手册)

视频号入口在哪里(视频号直播入口新手手册)

视频号助手在哪里?视频号助手什么时候上线?微信视频号助手正式上线目前微信视频号助手已经开始内测使用了,大家可以直接在PC端扫码登录,管理自己的视频号,可以看到自己的各项动态数据,非常方便管理。 视频号助手在哪里 视频号助手在哪里? 手机微…

抖音上热门技巧有哪些(dou+投粉丝量还是点赞量)

抖音上热门技巧有哪些(dou+投粉丝量还是点赞量)

前不久,“越来和锅锅”发布了自己的第一条抖音视频,结果该视频一天的播放量达到了2581万,至今获赞205.7万。可见,选择适合自己的视频表现方式比努力更重要。 (图片来源:抖音APP) 抖音如何上热门,一直是小伙伴们想要了解的答案。 如果…

闪客快跑2背景音乐(闪客快打andylaw的微博)

闪客快跑2背景音乐(闪客快打andylaw的微博)

《疯狂跑酷》是一款LowPoly(低多边形)画风的跑酷游戏,一场突如其来的大水淹没了城市,而你在游戏中扮演一名刚下班的男子,需要从被水淹没的城市中逃出生天。…

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

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

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