Androidではdip、dp、sp、pt、px

3409 ワード

dip:device independent pixels(デバイス独立画素).デバイスによって異なる表示効果があり、これはデバイスハードウェアに関係しており、一般的にWVGA、HVGA、QVGAをサポートするために画素に依存せずに使用することを推奨しています. 
dp:dipは同じです
px:pixels(画素).異なるデバイスの表示効果は同じです.
pt:pointは、標準的な長さ単位で、1 pt=1/72インチで、印刷業に用いられ、非常に簡単で使いやすい.
sp:scaled pixels(拡大画素).主にフォント表示best for textsizeに使用されます.
in(インチ):長さ単位. 
mm(ミリ):長さの単位.
3、測定単位の換算式
androidソースパッケージでJAvaでは、次の関数を見ます.
public static float applyDimension(int unit, float value,DisplayMetrics metrics)
{
	switch (unit) {
	case COMPLEX_UNIT_PX:
	    return value;
	case COMPLEX_UNIT_DIP:
	    return value * metrics.density;
	case COMPLEX_UNIT_SP:
	    return value * metrics.scaledDensity;
	case COMPLEX_UNIT_PT:
	    return value * metrics.xdpi * (1.0f/72);
	case COMPLEX_UNIT_IN:
	    return value * metrics.xdpi;
	case COMPLEX_UNIT_MM:
	    return value * metrics.xdpi * (1.0f/25.4f);
	}
	
	return 0;
}

この関数機能は、各単位を画素に換算する機能です.
metrics.density:デフォルトはDENSITY_DEVICE/(float) DENSITY_DEFAULT;
metrics.scaleddensity:デフォルトはDENSITY_DEVICE/(float) DENSITY_DEFAULT;
metrics.xdpi:デフォルトはDENSITY_DEVICE;
DENSITY_DEVICE:スクリーン密度
DENSITY_DEFAULT:デフォルトは160
1.dip:デバイス独立画素.デバイスによって異なる表示効果があり、これはデバイスハードウェアに関係し、一般的にWVGA、HVGA、QVGAをサポートし、画素に依存しないことを推奨しています.dipはスクリーン密度に関係し、スクリーン密度は具体的なハードウェアに関係し、ハードウェア設定が正しくなく、dipが正常に表示されない可能性があります.画面密度が160のディスプレイでは、1 dip=1 pxの場合、480*800のような画面解像度が大きい場合がありますが、画面密度が正しく設定されていません.例えば、160です.この場合、dipを使用すると異常が表示され、基本的には表示が小さすぎます.dipの換算:dip(value)=(int)(px(value)/1.5+0.5)2.dp:簡単でdipと同じです.  3. px:pixels(画素)、異なるデバイスの異なるディスプレイの表示効果は同じで、これは絶対画素で、いくらでも永遠に変わらない.  4. sp:scaled pixels(拡大画素).主にフォント表示best for textsizeに使用されます.Googleの推奨では、画素はdipを統一し、フォントはspを統一しています.例を挙げてpxとdipを区別する:pxは画素であり、pxを使うと実際の画素で描く.例えば、長さ240 pxの横線を描くと、480幅のシミュレータでは半分のスクリーン幅、320幅のシミュレータでは2/3のスクリーン幅となる.dipは、スクリーンの高さを480点、幅を320点に分ける.例えば、160 dipの横線を作ると、320でも480のシミュレータでも半分のスクリーンの長さになります.コードは次のとおりです.
public static int dip2px(Context context, float dipValue)
{
	final float scale = context.getResources().getDisplayMetrics().density; 
	return (int)(dipValue * scale + 0.5f); 
} 


public static int px2dip(Context context, float pxValue)
{ 
	final float scale = context.getResources().getDisplayMetrics().density; 
	return (int)(pxValue / scale + 0.5f); 
} 
public void logScreenInfo() {
        DisplayMetrics dm = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(dm);

        int width = dm.widthPixels;
        int height = dm.heightPixels;
        float density = dm.density;
        int densityDpi = dm.densityDpi;
        float xDpi = dm.xdpi;
        float yDpi = dm.ydpi;
        float scaledDensity = dm.scaledDensity;

        Log.d("info", "width = " + width);
        Log.d("info", "height = " + height);
        Log.d("info", "density = " + density);
        Log.d("info", "densityDpi = " + densityDpi);
        Log.d("info", "xDpi = " + xDpi);
        Log.d("info", "yDpi = " + yDpi);
        Log.d("info", "scaledDensity = " + scaledDensity);
    }
  :
D/info: width = 1920
D/info: height = 1032
D/info: density = 1.0
D/info: densityDpi = 160
D/info: xDpi = 213.0
D/info: yDpi = 213.0
D/info: scaledDensity = 1.0