본문 바로가기

Android

DPI, DP, PX, SP 단위의 정확한 정의

다양한 크기의 디바이스가 존재한다.

DPI (Dot Per Inch)

1인치당 픽셀의 수를 표현한다. 1 inch (2.54cm)에 몇 pixel이 들어가는가를 의미한다.

ldpi - Low density (120dpi) 
mdpi - Medium density (160dpi)
hdpi - High density (240dpi)
xdpi - Extra high density (320dpi)

1인치 단위에 많은 픽셀이 들어가게 되면 고해상도가 될 것이다.

 

px - 스크린의 실제 단위

screen pixels를 나타내는 단위이다.

실제 크기나 밀도와 관계없이 고정된 픽셀 단위를 의미한다.

mdpi(160dip)에서 1dp = 1px 이 기준이된다.

ldpi - 1dp = 0.75px
mdpi - 1dp = 1px
hdpi - 1dp = 1.5px
xdpi - 1dp = 2px

 

DP와 DIP (Density Indenpendent Pixel)

안드로이드 디바이스는 다양한 해상도가 존재한다. 이런 다양한 환경을 지원하게 위해서 만들어진 단위이다.

 

큰 화면이든 작은 화면이든 같은 비율로 적용된다. (실제로는 미세하게 차이가 발생한다..)

즉, ldpi에서 화면의 절반을 차지하는 레이아웃을 dp를 사용해서 그렸다면, xdpi의 화면에서도 절반을 차지하는 레이아웃이 그려져야한다.

/* 변환방법 */
px = dp * (160 / dpi) = dp * density
dp = px / (160 / dpi) = px / density

---------------

density = dpi / 160
ldpi - density = 0.75
mdpi - density = 1
hdpi = density = 1.5
xdpi = density = 2

 

Java code로 dp에서 px로 변환하는 예제

public int dpToPixel(int dp){ 
    int px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DP, context.getResources().getDisplayMetrics()); }

 

SP(Scalable Pixels)

DP가 Density에 독립적인 환경에서 픽셀을 표현하는 것이라면,

SP는 Scale값을 조절할 수 있도록 픽셀을 표현하는 단위이다.

DP는 장치의 해상도(밀도)와 관계없이 동일한 크기의 뷰를 보여지도록 하기 위해 사용됩니다.

SP는 시스템에서 설정한 폰트 사이즈에 영향을 받는 단위입니다.

즉, text를 sp단위로 설정해놓으면, 사용자가 설정한 시스템 폰트 크기 값에 따라서 유연하게 변화합니다.

 

정리

  • 글자를 표현할 때sp단위를 써야한다.
  • 레이아웃 등 뷰가 모든 디바이스에서 동일한 비율을 가지기 위해서는 dp를 사용해야한다.
  • 절대적인 사이즈인 px은 사용을 지양해야한다.
  • high-density는 같은 면적에 pixels이 많이 있다는 의미로 고밀도, 고해상도를 뜻한다.
  • 1dp = 1px의 기준이 되는 density는 mdpi(160dpi)이다.