めたる系IT日記

メタルを織り交ぜつつIT系を中心とした日記です

Android4.0(ICS)以降における文字サイズ

Galaxy Nexus などの Android4.0端末では、
「設定」→「ディスプレイ」→「フォントサイズ」
でフォントサイズを変更することができます。

この設定はシステム系の表示に限らず、各アプリに影響します。
このあたりしっかりと把握できていなかったのでまとめておきます。


<経緯>
 フォントサイズの指定にはsp(scaled pixel)という単位が標準的に使用されているようです。sp で指定するとシステムの設定に応じて表示されるサイズが決定されるようなのですが、これまではシステムの設定を変更することができませんでした(*1)ので、 sp = dp(dip) という状態でした。
なので sp という単位はあまり注目されませんでした。

*1) Spare Parts というアプリを使えば変更できったっぽい(1.5以上)
http://android-smart.com/2011/09/%E9%AB%98%E9%BD%A2%E8%80%85%E5%BF%85%E8%A6%8B%EF%BC%81android%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%85%A8%E4%BD%93%E3%81%AE%E6%96%87%E5%AD%97%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%99.html


<ポイント>
 しかしAndroid4.0からは、冒頭で説明したとおり標準でシステムの設定を変更できるようになりました。「特大」にするとかなり文字サイズが多くなることがわかります。あなたのアプリもチェックしてみましょう。以下にハマりそうなポイントを2つ挙げてみます。

■ハマリポイント[1] setTextSize()
 プログラム内でTextView等のフォントサイズを指定する場合は、setTextSize() を使います。setTextSize() には引数が一つのものと二つのものがありますが、恐らく多くの人が引数一つの方を使っていると思います。この場合、単位は何になるのでしょうか?....

答えは sp です。
えっ、って感じですがりファンレスにちゃんと書いてあります。

public void setTextSize (float size)

Set the default text size to the given value, interpreted as "scaled pixel" units. This size is adjusted based on the current density and user font size preference.

「プログラムで文字サイズ指定してるのに、システムの設定で文字が大きくなっちゃう!!」って人は大抵ここでハマっています。
ということで、文字サイズを確実に指定したい人は、引数二つの方の setTextSize() を使いましょう。

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);

このように書けば sp では無く dip でフォントサイズを指定することができます。


■ハマリポイント[2] フォントサイズ指定してない
 上記の setTextSize() や android:textSize でフォントサイズを指定していない場合はどうなりますか?明確なソースは見つかっていませんが、通常は 14sp の設定になるようです。なので、これも同じ様に設定次第で文字のサイズが変わってしまいます。困った人は setTextSize() や android:textSize を追加しましょう。これで解決です。


<理想>
 システム設定でフォントサイズを変更できる、というのは素晴らしいことだと思います。より多くの人に使ってもらうことができます。本来であれば各アプリも設定に応じて文字サイズを変えるべきであって、sp を使用するべきだと思います。この辺はコレからって感じですかね?


<参考にしたサイト/同じことでハマった人>
[Y.A.M の 雑記帳 : Android TextView の setTextSize() は sp 単位だよ!]
http://y-anz-m.blogspot.jp/2012/02/androidtextview-settextsize-sp.html
[Android4.0でフォントサイズが変わるのを何とかする]
http://d.hatena.ne.jp/STAR_ZERO/20111021/1319207408


<最後に>
 「フォントサイズ」なのか「文字サイズ」なのか、統一しようと思いつつ10年くらい経過しています...