« デフォルトフォントの選択 | メイン | エンジンのバージョン番号 »

2016年11月30日

Android:: Android のフォントを C++ から利用する

    

Java から使用するのは Typeface クラスを用いればすぐできるが、C++ (NDK) から利用しようとするとあまり情報がないので、調べた内容をある程度まとめておく。

フォントファイルは /system/fonts/ ディレクトリに入っている。
使用するのは大体 TrueType/OpenType だろうから、このフォルダ内の拡張子が .ttf/.ttc/.otf のファイルを列挙すればよい。
.ttf TrueType
.ttc TrueTypeフォントを複数まとめたもの
.otf OpenType
といった感じ。
列挙は opendir で開いて DT_REG のファイルの拡張子で比較すれば済む。

日本語フォントはバージョンによって異なり――
Android 3.x以前 DroidSansJapanese.ttf(Droid Sans Japanese)
Android 4.0~5.x MTLmr3m.ttf(MotoyaLMaru), MTLc3m.ttf(MotoyaLCedar)
Android 6.0以降 NotoSansJP-Regular.otf(Noto Sans JP)
となる。括弧内は FreeType で開いた時に得られるファミリー名。
もちろん今後変更になる可能性は十分ある。

上記フォントファイルの内、端末内に存在するフォントファイルを使ってもいいが、Java で利用した時に使われるフォントと同じものを使おうとすると /system/etc/fonts.xml や /system/etc/system_fonts.xml を読み込む必要がある。
また、日本語フォントの場合、バージョンによっては /system/etc/fallback_fonts-ja.xml や /system/etc/fallback_fonts.xml などのファイルも読み込む必要がある。
fonts.xml のフォーマットはバージョンによって違う。
最新のものはかなりわかりやすい形になっている。

このファイルを読み込むソースコードは Java なら StackOverFlow の How to change fontFamily of TextView in Android の中ほどにある FontListParser を使えばできる
ここの FontListParser は、元々 Android のソースコードと同名のクラスを改造したもののようだ。
Android の Typeface クラスが FontListParser クラスを使用して上記 XML ファイルを読み込んでいるので、これを使えば使用されるフォントがわかる。
もちろんバージョンにって切り替える必要があるし、将来変更される可能性もある。

以上が調べたフォントに関する情報だが、バージョンによって違ったり将来的に変更の懸念があるので、使用する文字に削ったフォントフォイルを自前で持っておくのが安心。
Note からはそうそう変わらないんじゃないかと思うが、あっさり変えてくることも十分考えられる。


投稿者 Takenori : 2016年11月30日 22:45




comments powered by Disqus
Total : Today : Yesterday : なかのひと