Design Systemに沿ったTypographyするためには


インターン先で運用されている既存のAndroidアプリにDownloadable Fontを導入した際、同時にアプリ内のTextStyleをDesign Systemに沿ったTypographyに直すことになりました。

そのときにぶつかった問題と、どう解決したか、そもそもどうしてその問題が起きたのかを書いていきます。

こういう事例があったんだな、程度に読んでいただければ幸いです。


# 話すこと

- Typographyの重要性
- Typographyを見直したときに問題になったこと
- それをどう解決したか
- その問題を起こさないためにはどうすればよかったのか

# 話さないこと

- Downloadable Fontの導入方法や、内部でどのような処理を行なっているか。

この事が知りたい方は、[takahirom](https://twitter.com/new_runnable)さんが詳しい説明をスライドで上げているので、

ぜひ読んで見てください。とても参考になりました。

> Support LibraryのDownloadable FontsやEmojiCompatに対応したアプリを作ろう
> [https://speakerdeck.com/takahirom/support-libraryfalsedownloadable-fontsyaemojicompatnidui-ying-sitaapuriwozuo-rou](https://speakerdeck.com/takahirom/support-libraryfalsedownloadable-fontsyaemojicompatnidui-ying-sitaapuriwozuo-rou)


# Material DesignにおけるTypographyの重要性

![CoverImage](https://s3-ap-northeast-1.amazonaws.com/hatena.masegi/DownloadableFont/mio-design%252Fassets%252F1foNJWxIuKmdfivR2kYX2rUY1wu8KSkbx%252Fapplyingtypescale-headlines-display.png)

> Material Design - The type system
>[https://material.io/design/typography/the-type-system.html#type-scale](https://material.io/design/typography/the-type-system.html#type-scale)

Google I/O 2018でMaterial Designが大幅に更新され、今までのをMaterial Designをベースにしながら、個性を持たせようという動きが出てきました。

様々なViewのComponentsがアップデート、ないしは追加され、よりアプリごとのDesign Systemが重要になってきています。

そのDesign Systemの中の一分野である**Typography**は、アプリの個性を際立たせる大切な部分です。

GoogleもTypographyに本腰を入れたようで、とても簡単に好きなフォントを使えるようになる**Downloadable Font**をSupport Libraryに追加しました。

インターン先でも、Downloadable Fontを導入すると同時にTypographyの見直しを行うことになりました。

ps. Design Systemについてはわかりやすい記事があったので、参考にしてください。

> Webにおけるデザインシステムとは？
> 
[https://parashuto.com/rriver/development/what-is-a-design-system](https://parashuto.com/rriver/development/what-is-a-design-system)

# Typographyを見直したときに問題になったこと

## 経緯

今回Typographyを直そうとしたアプリは、立ち上げの際、しっかりとしたDesign Systemが用意されておらず、FontStyleもざっくり決めていました。

その後プロダクトが大きくなり、いざ、Design Systemを用意して導入しようとなったときに、

受け入れる体制ができておらず、問題が発生しました。それぞれを紹介していきます。

## dimen_text.xmlが適したところに使われていない

![Design System - Typography](https://s3-ap-northeast-1.amazonaws.com/hatena.masegi/DownloadableFont/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2018-08-25+23.06.40.png)

見直す前にも、上のイメージのような`styles_tex.xml`を作成されてあり、使用されていました。

これを少し修正すればDesign System通りのTypographyになるじゃん！
と思ったらそうはいきません。

具体的には、以下の通りです。

![example - Bad use dimen](https://s3-ap-northeast-1.amazonaws.com/hatena.masegi/DownloadableFont/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2018-08-25+22.26.07.png)

ここでの問題は、textSizeがTitleのものと一致しているからと、HeadlineでTitleのtextSizeを使用していることです。

これでは、`text_size_title`の値を変更してしまったら、予期せぬところでフォントのサイズが変わる可能性が出てきてしまいます。

これはいけません。

このような良くない使い方をしている箇所が多々あり、修正しようにも、修正すべきところか否かの判断が大変になってしまいました。

### 解決方法

**しらみ潰しです。**

デザインと睨めっこしながら、それぞれ確認して修正しました。

修正したところが一目でわかるように、新しく`TextAppearance.WTheme`と、`w_text_size_~`を立てて、それを使うように切り替えました。

## TextViewの上下の空白問題

新しいテーマも立てたし、Downloadable Fontで使えるようになったフォントを使おう！
と思ったらまた問題が出てきました。

TextViewの謎空白問題です。

***Robot***ではあまり目立たなかったのが、今回使うことになった、***Poppins***では顕著に出てしまいました。

![space of TextView](https://s3-ap-northeast-1.amazonaws.com/hatena.masegi/DownloadableFont/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2018-08-25+23.52.56.png)

textSize一緒なのにこの大きさの違い......

これでは、フォントを変えるとレイアウトにまで影響が出てしまう.....

ということで、`android:includeFontPadding="false"`と指定することで軽減できました。

![non space of TextView](https://s3-ap-northeast-1.amazonaws.com/hatena.masegi/DownloadableFont/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2018-08-25+23.58.39.png)

ですが、、ここでまた問題。

## TextAppearanceの指定方法がバラバラ

TextViewのTextAppearanceを変更するには、二つ方法があります。

1. android:textAppearance="@style/~"
2. style="@style/~" 

ですが、`android:includeFontPadding`は、２の方法でないと適用されません。

今回のアプリでは、1. と 2. がそれぞれ半々で使用されていました。

そもそも、TextAppearanceの指定は`android:textAppearance`でのみにすべきでは？
と思われるかもしれませんが、今回は置いておきます。

### 解決方法

**それぞれ顕著なところにのみ`android:includeFontPadding="false"`をつけていきました。**

良い解決方法ではないと思いますが、時間がないということもあり、このような解決方法になってしまいました。


# これらの問題を起こさないためにはどうすればよかったのか

## `styles_text.xml`, `dimens_text.xml`を意識して使う

![Design System - Typography](https://s3-ap-northeast-1.amazonaws.com/hatena.masegi/DownloadableFont/mio-design%252Fassets%252F1b6v9bKjQPubZauQsAVRZBpFyBPo4eR2a%252Frallytypescale.png)


**ここは見出し１に対応しているからH1のスタイルを、ここは本文だからBody1のスタイルを使う。と意識してスタイルを使うようにしましょう。**

意識せずにコーディングすると、デザイナーさんが用意してくれたせっかくのDesign Systemが無駄になってしまいます。

また、見出しスタイルを使うところだけどtextSize的にはタイトルと同じ、という場面でも、安易に

`android:textSize="@dimen/text_size_title`としないこと。

`dimen_text.xml`には、スタイルで使うものとは別に、`text_size_~sp`を用意すると、<u>間違った使い方</u>が減ると思います。

## Android開発チームで事前にルールを定めておく

今回の、TextAppearanceをstyleで指定するか、android:textAppearanceで指定するか、の問題は、

EditTextViewに関しても、android:themeで指定するか、styleで指定するか、にも通じていると思います。

- チームでコーディングについてのルールを定めておく
- Lintを用いて弾くようにする

などの対策を立てておくことが、こういった問題に対する最善の解決策だと思います。

# 最後に....
 
 今回自分が遭遇したのは稀なケースだと思いますが、Material Themingが浸透すれば、Typographyまでもガラッと変えるケースが多くなってくるのかな？と考えています。
 
こいった事例があった、ということを頭の片隅に置いていれば幸いです。


とりあえず、Googleさん早くDownloadable Fontに日本語対応を.....