タグ別アーカイブ: dp

[Android] dp , sp の単位について


 
pxは使うな

このことはよくきいていたが、では単位として用意されている「dp」「sp」の違いはなんだろう。。。

参考:http://y-anz-m.blogspot.jp/2012/02/androidtextview-settextsize-sp.html

  1. dp  レイアウトの幅などを調整するときに使う
  2. sp  文字のフォントサイズを指定するときに使う

ということらしい。。

spはシステム全体の文字スケールに合わせるとあるが、scaleDensityの値によって大きさが変わるものらしい。本文中の文字など大きさを変わってもししょうがないものについてはこれで行ける。

dpは解像度によって見え方を統一できる単位。レイアウトの大きさやヘッダーやフッターの文字など、一定の大きさからスケールしてほしくないものに対して使える。

ちなみに、

TextView の setTextSize() はspが使われているらしい。

変更するときは

public void setTextSize (int unit, float size)  の第一引数のunitにTypedValueの定数を指定すれば良い

  • COMPLEX_UNIT_DIP : dp, dip
  • COMPLEX_UNIT_MM : mm
  • COMPLEX_UNIT_PT : pt
  • COMPLEX_UNIT_PX : raw pixels
  • COMPLEX_UNIT_SP : sp

 
 

◆◆ 単位に関する参考情報 pxに変換する方法 ◆◆
  •  sp, から pt, px に変換する 
dp から pt に変換する方法(Android dip, dp, から pt, px に変換する)と同じように
getContext().getResources().getDisplayMetrics().scaledDensity
で文字スケールも考慮された比率がとれるので、 これを sp 単位の値にかければ pt, px 単位になります。
 
  • Android dip, dp, から pt, px に変換する

 

以下は以前に自分が書いたJava上からdpを指定するように変換するソース

public static float getDisplayScale(Context context) {
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics dm = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(dm);
    return dm.scaledDensity;
}

//使うときはActivityのクラス内で、以下のようにする。
float displayScale = getDisplayScale(getContext());
int size = (int) (50 * displayScale + 0.5f);  

// + 0.5fしているのはスペースがintにキャストした時にスペースが潰れないようにするため。
// 繰り上げさせるように。
//sizeをLayoutParamsのサイズに指定するなどすると解像度に
//依存しないdpを指定したようなサイズで設定できる。