Programing/Android

Resolution and DP (Density Independent Pixels)

안중환 2016. 5. 7. 22:16

1.안드로이드의 주요 단위

용어 및 단위설명
Pixel화면상의 픽셀
Resolution픽셀 단위의 화면 크기.
예를 들어, 갤럭시노트 10.1의 해상도는 1280*800인데, 이는 픽셀이 1280개 및 800개임을 의미한다.
DPI (Dots Per Inch : 밀도)

물리적인 1 인치 당 포함되는 픽셀 개수. 예를 들어, 160 DPI는 1인당 픽셀이 160개 포함된다는 것을 의미한다.
주요 DPI는 다음과 같다.

  • - ldpi (low) : 120 DPI
  • - mdpi (medium / baseline) : 160 DPI
  • - TVDPI : 213 DPI
  • - hdpi (high) : 240 DPI
  • - xhdpi (extra high) : 320 DPI
  • - xxhdpi (double extra high) : 480 DPI

mdpi에서 1DPI = 1PX

DIP (Density Independent Pixels) 또는 DP밀도 독립 단위로, 장치의 밀도에 상관없이 물리적으로 (거의) 동일한 크기를 갖는다.
스크린 크기물리적인 크기의 종류를 나타낸다. 다음의 4종류가 존재한다
  • - X-Large: 주로 10.1 인치 이상의 디바이스
  • - Large: 주로 5인치 이상의 디바이스
  • - Normal: 3인치에서 5인치 미만의 사이의 디바이스
  • - Small: 3인치 미만의 디바이스
SP (Scale Independent Pixels)스케일 독립 픽셀 단위로 , dip와 유사하며, 글꼴 크기를 지정할 때 주로 사용된다.

디바이스별 테스트

갤럭시노트 10.1옵LTE 2넥서스7옵Q
해상도 (PX 단위)800 x 1280720 x 1280800 x 1280480 x 800
해상도 (DP 단위)800 x 1280360 x 640600 x 961320 x 533
DPI160 DPI320 DPI213 DPI240 DPI
스크린 크기X-LargeNormalLargeNormal
밀도 비율 (DPI / 160)121.3312501.5
Keypoint
- 안드로이드의 기준 DPI는 중간 수준인 160 DPI이다.
- 160 DPI를 기준으로 DPI가 크면 밀도가 높아지고, DPI가 작으면 밀도가 낮아진다.
- 또한, 160 DPI인 경우 밀도독립 단위인 DP(DIP)와 픽셀이 같은 크기를 갖는다.
즉, 160 DPI에서 1 DP는 1 PX이 된다.

2.DIP (Density Independent Pixels) 또는 DP

DP 단위는 독립적인 크기를 나타낼 수 있도록 하는 단위이다. 이론상 어떠한 해상도에서도 같은 크기를 보여주는 것이 핵심 개념이다.

표준이 되는 화면크기를 중심으로 보다 큰 화면에서는 지정된 배율로 크기를 늘려주고, 작은 화면에서는 지정된 배율로 크기를 줄여준다.

DP 계산법
px = dp + (dpi / 160)

    * 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());

    }