安卓手機ttf字體下載 安卓ttf字體怎么使用



文章插圖
安卓手機ttf字體下載 安卓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 JNICALLJava_osg_AndroidExample_osgNativeLib_setLocalFont(JNIEnv *env, jobject obj, jstring fontName);...extern "C" JNIEXPORT void JNICALLJava_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 JNIenv->ReleaseStringUTFChars(fontName, lfont);}由于NDK只支持C語言的語法,所以osgNativeLib還要再二傳手,把路徑傳給OsgMainApp,一般來說這個文件才是我們OSG的起始文件 。
// OsgMainApp.hppvoid addText(const std::string & font);//OsgMainApp.cppvoid 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指定字體文件的路徑,這樣代碼更簡潔些 。
【安卓手機ttf字體下載 安卓ttf字體怎么使用】實際效果