2012年2月24日金曜日

Android TextView の setTextSize() は sp 単位だよ!

いままでも sp という単位が用意されていましたが、標準の設定アプリでシステムの文字スケールを 設定できないかったので、ほぼ dp と同じような振る舞いでした。
Android 4.0 の設定アプリではシステム全体の文字スケールが設定できるようになっています。

[Display] - [Font size]



これによって sp 単位で指定した値はシステム全体の文字スケールに応じて実際のピクセル数が変わります。

Small


Normal


Large


Extra large


で、ここからが本題。

TextView の 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.

Related XML Attributes
android:textSize

Parameters
size The scaled pixel size.
---

コンテンツの本文とかはこれでいいのですが、ヘッダー部分などシステム全体の文字スケールに影響されたくない部分もあります。 そういう場合に dp など sp 以外の単位で指定するには、引数を2つとる setTextSize() を使います。

---
public void setTextSize (int unit, float size)

Set the default text size to a given unit and value. See TypedValue for the possible dimension units.

Related XML Attributes
android:textSize

Parameters
unit The desired dimension unit.
size The desired size in the given units.
---

第1引数で単位として TypedValue の定数を指定します。

  • COMPLEX_UNIT_DIP : dp, dip
  • COMPLEX_UNIT_MM : mm
  • COMPLEX_UNIT_PT : pt
  • COMPLEX_UNIT_PX : raw pixels
  • COMPLEX_UNIT_SP : sp
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DisplayMetrics matrics = getResources().getDisplayMetrics(); float density = matrics.density; float scaledDensity = matrics.scaledDensity; ((TextView)findViewById(R.id.density)).setText("density : " + density); ((TextView)findViewById(R.id.scaledDensity)).setText("scaledDensity : " + scaledDensity); TextView tv1 = (TextView) findViewById(R.id.text1); tv1.setText("setTextSize(20)"); tv1.setTextSize(20); TextView tv2 = (TextView) findViewById(R.id.text2); tv2.setText("setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20)"); tv2.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); } }




■ sp, から pt, px に変換する

dp から pt に変換する方法(Android dip, dp, から pt, px に変換する)と同じように

getContext().getResources().getDisplayMetrics().scaledDensity

で文字スケールも考慮された比率がとれるので、 これを sp 単位の値にかければ pt, px 単位になります。


0 件のコメント:

コメントを投稿