2013. 10. 15. 22:58


[Android] 해상도와 dpi, px, dp, dip, sp의 관계


안드로이드는 아이폰과 달리 다양한 해상도를 지원하기 때문에 디자인 적으로 골머리를 썩는 경우가 많다. 특히 요즘에는 세로로 긴폰, 가로로 긴폰 등 너무 다양한 폰들이 제멋대로 나와서 참 개발하려면 막막한데.. 해상도와 dpi, px, dp, dip, sp의 관계에 대해 기본적인 것들을 알아보자.


1. dpi (Dot Per Inch)

1인치당 픽셀 수. 물리적 단위인 1 inch (=2.54cm)에 몇 픽셀이 들어가는가를 나타내는 단위다. 


Low density (120dpi) : ldpi

Medium density (160dpi) : mdpi

High density (240dpi) : hdpi

Extra High density (320dpi) : xdpi



2. px

스크린의 실제 픽셀 단위를 사용하며, 실제 크기나 밀도와 상관이 없다. mdpi(160dip)에서 1dp = 1px 이다. 따라서


ldpi : 1dp = 0.75px

mdpi : 1dp = 1px

hdpi : 1dp = 1.5px

xdpi : 1dp = 2px;



3. dp 와 dip (Density Independent Pixel)

말 그대로 실제 픽셀에 독립적인 단위로 안드로이드 폰의 다양한 해상도를 지원하기 위해 만든 단위이다. 큰 화면이든 작은 화면이든 같은 크기로 나타나게 되어있다. (그러나 적용해보면 미세하게 다르다..) 즉, 화면이 작은 폰에서 10원짜리 만하게 나타난다면 화면이 큰 폰에서도 10원짜리 만하게 나타나도록 되어있다. dp(dip)와 px간의 변환을 하는 방법은 아래와 같다.


dp(dip)와 px간의 변환

px = dp * (160 / dpi) = dp * density

dp = px / (160 / dpi) = px / density


여기서 density는 density = dpi / 160 계산 한다.

ldpi : density = 0.75

mdpi : density = 1

hdpi : density = 1.5

xdpi : density = 2



※ dpi와 density 구하는 방법


DisplayMetrics outMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(outMetrics);

int dpi = outMetrics.densityDpi;

float density =  outMetrics.density;


※ java코드에서 dp를 px로 바꾸는 방법

java코드에서 density또는 dpi를 이용해서 dp를 px로 변환할 수도 있지만 TypedValue를 이용해서 다음과 같이 구할 수 있다.


public int dpToPixel(int dp){

int px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DP, context.getResources().getDisplayMetrics());

}



4. sp

dp와 비슷하지만 사용자가 선택한 글꼴 크기에 의해 크기가 조절된다.



요약하자면, 레아이웃 등의 UI적 요소는 dp(dip)을 사용하는 것이 좋고, 글자 크기에는 sp를 사용하는 것이 좋으며 되도록이면 px은 사용하지 않는 것이 좋다는 것! 다만 폰들 마다 가로 세로 비율이 다르기 때문에.. dp를 쓴다고 모두 해결되는 것은 아니라는 점!!!




Posted by 초보코딩왕

댓글을 달아 주세요

  1. 뚜벅초 2015.01.09 17:08 신고  댓글주소  수정/삭제  댓글쓰기

    px = dp * (160 / dpi) = dp * density
    이거아닌가요?
    http://developer.android.com/guide/practices/screens_support.html
    에 px = dp * (dpi / 160). 라고 적혀있는데..