最火免費手機字體軟件:安卓手機字體ttf怎麼用

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指定字體文件的路徑,這樣代碼更簡潔些。如何在OSG的Android平台上顯示漢字

實際效果

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/218476.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 00:31
下一篇 2024-12-09 00:31

相關推薦

發表回復

登錄後才能評論