TextView等に独自のフォントを使いたい時があるだろう。
1〜2箇所なら画像で用意するというのも手だが、数え切れないくらい必要であったり、どうしても文字列でないと困る場合もある。

そんなときはTextView(やその他のView)のサブクラスを作るのが手っ取り早い。
以下に、その手順を見ていくことにする。 

なお、フォントはこちらのものを使用させていただいた。
Kazesawa フォント: M+ と Source Sans Pro の合成フォント
 
カスタムTextViewを作る

1.各コンストラクタでフォントの設定を行う。
 その際にisInEditMode()で条件付けを行う。
 これをしないとレイアウトエディタ上でエラーが出る。

2.フォントの読み込みを行う。
 staticなフィールドを用意して、一度だけ読み込むようにする。
 仮にインスタンスが作られるごとに読み込むようにしていたら、メモリも大量に消費するし、表示にすごく時間がかかるようになってしまう。
 (特にListViewの中で使用する場合等だ。)

フォントを読み込む
フォントを読み込むにはassetsフォルダに置いたフォントを直接読み込む方法もあるが、assetsフォルダはzipファイル以外は1Mまでという制限があるそうなので、assetsにフォントを圧縮したものを置いておき、内部ストレージに中身を展開することにする。

まずは使用するttfファイルを圧縮してfont.zipというファイルを作り、それをassetsフォルダに置く。
font_ss1


それでは読み込みを行うアクティビティを作成しよう。

1.アクティビティには何らかのViewが必要なので、TextViewを追加する。
 なお、この段階ではまだフォントファイルを取り出していないので、通常のTextViewを使う。

2.初期化を行うタスクを実行する。
 タスクの詳細は次に述べる。

zipファイルからフォントを取り出す
zipファイルからttfファイルを取り出そう。
先ほど呼び出しを行った初期化のタスクの中で全て行う。

1.ttfファイルの存在を確認し、ない場合のみ展開を行う。
2.assetsフォルダ直下にあるfont.zipを読み込む。
3.zip内にあるすべてのファイルを展開する。
4.Macで圧縮を行うと__MACOSX〜のようなファイルが勝手に同梱されてしまうので、それらは無視する。
5.ファイルの書き出しを行う。
6.次のアクティビティに遷移する。

これで一通りの処理は完了だ。
次のアクティビティに遷移して、そこでカスタムフォントを表示してみよう。

カスタムフォントを表示する。
表示用にxmlを以下のようにしよう。

デフォルトのフォントのTextViewとカスタムフォントのTextViewを一つずつ設定してある。

あとはActivityからこれを読み込むだけだ。

実行するとこのようになる。
font_ss2
カスタムフォントが正常に表示された。