woshidan's blog

そんなことよりコードにダイブ。

Androidでは1spの大きさがユーザー側で指定できる件について

そういえば、デザイナーさんが文字をdpで指定していて、遥か昔、文字は基本spでって聞いた覚えがあったのに何でかな、と思ったら、 3年前からspはユーザー側で1spあたりの表示サイズが変更できるようになっていたらしいです。

Y.A.M の 雑記帳: Android テーマでデフォルトの sp 単位を置き換える

metal-president.hatenablog.com

1spあたりの端末上のサイズは端末の解像度にはよらないが、 その1spのサイズに対して、ユーザーがさらに倍率を設定できる、と。

すると何が困るって、余白をpaddingで指定したTextViewの文字サイズをspで指定していた場合、 余白のサイズとViewの高さなどがぎりぎりの場合、文字の下の方が切れてしまうのです。

    <TextView android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#f00"
        android:padding="12dp"
        android:textSize="12sp"
        android:textColor="#fff"
        android:textStyle="bold"
        android:gravity="center_vertical|center_horizontal"
        android:text="フォントサイズ怖い" />
フォントサイズの設定: 中

f:id:woshidan:20151123030813p:plain

フォントサイズの設定: 特大

f:id:woshidan:20151123030821p:plain

フォントサイズの指定について

方針としては4つくらいありそう。

  • ユーザーの設定を無視したい
    • すべてdpで指定する
    • 解像度が低い端末だと文字が大きく、高い端末だと文字が小さく感じる
  • ボタンの大きさは固定でもなるべく文字を見えるようにしたい
    • android:layout_heightandroid:gravityだけ指定しておく
    • 文字が大きくなった場合、余白が狭くなっていき、最終的にはみだした部分は見えなくなる
      • android:ellipsize="end"とかも指定しておくと見えなくなった部分は ... ってなるからマシかも...
  • ボタンの大きさと余白を文字が見えなくなってもいいので守りたい
    • android:gravityandroid:padding,android:layout_heightを指定(要は上記)
    • 余白部分はせまくならないが、余白が文字より優先されて文字が半分に切れていたりとかする
  • 多少ボタンが大きくなっても余白を守りたい
    • android:minHeight + android:layout_height="wrap_content"指定を使う
    • 文字が大きめに設定されている場合は文字が大きくなり、余白の分だけボタンが伸びます
    • レイアウトが全体的に縦に伸びてスクロール量等が多少増えても問題ない場合はこれが目には優しそう...

なんていうかね、新しい端末に変えてから、世の中のAndroidアプリって文字大きいなって思ってたら、自分の端末がまさかの文字サイズ特大だったっていうな!

中サイズにして、どうしよう、世の中のアプリってこんなに文字が小さかったのっていってるって言うね。

どれがいいかは分からないけれど、全部の端末を試すのは鬼のような手間なので、プロジェクト内で取ってる方針について、極端な場合どう崩れるか、それは許容できるか、部分的に他の指定方針を使うのか、といったことを把握しておくのがいいと思います。

Android 4.0 以降で設定が可能というのは数年前は新しい携帯の話でしたが、いまや9割方以上文字サイズ設定できるので...。