Android
font

AndroidでNotoフォント・Robotoフォントを使う

More than 3 years have passed since last update.

マテリアルガイドラインのStyle > Typographyには、英数字にはRobotoフォント、マルチバイト文字にはNotoフォントがいいと書いてあります。

ガイドラインに従ってフォントを変えてみたので、やり方をメモしておきます。


Calligraphyを導入

今回はCalligraphyというライブラリを導入して実装しました。

アプリ独自にフォントファイルを適用するUtilクラスの記事にあるようなやり方もあるのですが、TextViewやEditTextなどに個別で実装しなければいけないのが面倒そうだったので、アプリ全体に一括でフォントを反映できるCalligraphyを採用しました。

以下、導入方法です。


1. build.gradleに追加


build.gradle

dependencies {

compile 'uk.co.chrisjenx:calligraphy:2.0.1'
}


2. ttfファイルを配置

app/src/main/assetsにRoboto-Light.ttfなどのフォントファイルを配置します。


3. Application#onCreateで初期化

アプリのデフォルトフォントを変更する場合、ApplicationクラスのonCreate()で初期化します。


Application.java

@Override

public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/Roboto-Regular.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
}


4. Activityで初期化

Activityでcontextにinjectします。


Activity.java

@Override

protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}


5. xmlでフォントを変更する

TextViewやEditTextの属性に、fontPathをセットします。

IDE上でエラーになる場合は、tools:ignore="MissingPrefix"を追加してください。

<TextView

android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fontPath="fonts/Roboto-Regular.ttf"
tools:ignore="MissingPrefix"/>


Notoフォントの注意点

実は、GoogleのNotoフォントのページから日本語に対応したNotoSansCJKJPを使うと、上下にスペースが入ってしまって使えませんでした。otfファイルだからでしょうか?詳しく知っている人がいれば教えてください。

2015-02-17_15_46_30.png

そこで、Noto Sans CJKをTrueType形式に変換した派生フォント源真ゴシックを使用しました。源真ゴシックのttfファイルを使うと問題なく表示されました。


フォント比較


デフォルト(変更なし)

2015-02-17 16.02.40.png


roboto

2015-02-17 16.02.50.png


noto sans cjk

2015-02-17 16.02.58.png


感想

ActivityでInjectしてるので起動が遅くなったりするかと思いましたが、体感できるほどの差はありませんでした。また、フォントを入れることによるapkのサイズ増加もそこまで気になるほどではなかったです。

ただ、正直見た目そんなに変わらないような気もします。スタイルの種類が増えるので、textStyle="bold"まで目立たせたくないけど通常の文字よりは目立たせたい、といった場合には使い勝手がいいかもしれません。

まぁ無理に対応する必要はないのかなという印象です。

ちなみに今回試したサンプルプロジェクトのリポジトリはこちらです。参考までに!