awacleberryの備忘録

アナログ人間のデジタル日記。

【Android】TextView の SetTextSize についてのメモ

TextView に 文字サイズを指定する方法についてのメモ。

getDimention して setTextSize をする

#setTextSize(float) にあるように、

void setTextSize (float size)

と引数一つの場合は、sp の指定となる。

dimens.xml で定義したサイズを取得する際に以下のようにするが、この返り値は px 変換されたものなので、都合が悪い。

getResources().getDimension(R.dimens.hoge);

次のようにすると、sp 値を px 値変換したものを sp 値として設定してしまうことになる(xml で sp 値を定義しているのが前提)。

tv.setTextSize (getResources().getDimension(R.dimens.hoge));

sp 値を px 値変換したものを px 値として渡すには、単位付きのメソッドを使用する。

void setTextSize (int unit, float size)

#setTextSize(int, float) にあるように、第1引数には、TypedValue で定義された定数を使う。

tv.setTextSize (TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimens.hoge));

こうすれば、一応意図した値を設定できる。

OS のフォントサイズ設定を無効にする

sp はディバイスで設定できるフォントサイズの倍率が掛けられるので、タブなどの限られた領域でフォントサイズを指定する場合には都合が悪い。

xml で sp 値を設定していて、かつ、OS のフォントサイズの影響を受けないようにするには、設定されている倍率を取得して割れば良さそう。

float scale = getResources().getConfiguration().fontScale;
tv.setTextSize (TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimens.hoge) / scale);

そもそも xml で dp 値として定義できれば、それでも良さそう。あるいは、dp の数値を float で取得できるなら、TypedValue.COMPLEX_UNIT_DIP の単位指定をし、

float dpVal = 20;
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, dpVal);

とかが考えられそう。