본문 바로가기

컴퓨터/안드로이드

[안드로이드] pixel 에서 dp , dp 에서 px 사이즈 변환

반응형

 

 

 

 

px -> dp , dp -> px 변환에 대해 알아보기 전에 왜??? 이 변환에 대해서 알아야 할까요?

 

xml에서는 dp단위로 View의 사이즈 조절이 가능하지만, java 코드상에서는 px(pixel)단위로만 View의 사이즈를 조절 할 수 있습니다.

그렇기 때문에 java 코드상에서 dp단위를 사용하기 위해서는 dp를 px로 바꾸는 과정이 필요합니다.

 

 

java 코드상에서 dp단위를 사용하는 과정

원하는 dp 단위 값 -> px단위로 변환 -> 변환된 px 값으로 view 사이즈 조절

 

 

 

 

이유를 알았다면 px , dpi, density, dp 에 대해서 알아보겠습니다. 

 

 

 

 

PX (pixel)

px는 화면을 구성하는 최소 단위입니다.

px 단위를 사용하게 되면 화면에 상관없이 지정한 수치만큼 보여지게 됩니다.

즉, 화면의 픽셀밀도에 따라 다른 크기로 보여질 가능성이 있습니다.

px단위를 사용하게되면 픽셀밀도가 작은 기기에서는 잘리는 경우가 있을 수도, 

화면이 픽셀밀도가 큰 기기에서는 공백이 지나치게 많이 생길 수도 있습니다.

 

 

 

 

그렇기 때문에 px단위 보다는 dp단위를 사용하는 것이 좋습니다.

dp단위를 알아보기전 dpi, density에 대해서 알아보겠습니다.

 

 

 

DPI (Dot Per Inch)

dpi는 1인치에 들어가는 픽셀의 갯수를 나타낸 단위입니다.

( ex : 160dpi = 1인치 당 픽셀이 160개 )

안드로이드에서는 160dpi가 기본이며 안드로이드에서 주요한 dpi는 아래와 같습니다.

 

ldpi : 120dpi

mdpi : 160dpi (기본)

hdpi : 240dpi

xhdpi : 320dpi

xxhdpi : 480dpi

xxxhdpi : 640dpi

 

 

 

 

density

density는 pixel의 밀도를 표시하는 단위입니다.

안드로이드에서 density는 (DPI / 160) 으로 구할 수 있습니다. 

( ex  : mdpi 기기일 경우 160 / 160 이므로 1 )

( ex  : xhdpi 기기일 경우 320 / 160 이므로 2 )

 

 

 

 

 

DP (DIP, Density Independent Pixel)

dp는 Android에서 다양한 화면 크기를 지원하기 위해 만든 단위입니다.

자신이 만든 레이아웃이 다양한 기기에서 동일하게 보여지기 위해서는 dp단위를 사용해야 합니다.

 

 

 

 

 

PX -> DP

dp = px / density

dp = px * 160 / DPI

 

( ex  : mdpi(160dpi) 기기일 경우 )

50px -> ( 50 / 1 ) -> 50dp

50px -> ( 50 * 160 / 160 ) -> 50dp

 

( ex  : xhdpi(320dpi) 기기일 경우 )

50px -> ( 50 / 2 ) -> 25dp

50px -> ( 50 * 160 / 320 ) -> 25dp

 

 

 

DP -> PX

px = dp * density

px = dp * DPI / 160

 

( ex  : mdpi(160dpi) 기기일 경우 )

50dp -> ( 50 * 1 ) -> 50px

50dp -> ( 50 * 160 / 160 ) -> 50px

 

( ex  : xhdpi(320dpi) 기기일 경우 )

25dp -> ( 25 * 2 ) -> 50px

25dp-> ( 25 * 320 / 160 ) -> 50px

 

 

 

 

안드로이드 스튜디오에서 DPI, density 구하기

 

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        
        int dpi = displayMetrics.densityDpi;
        float density = displayMetrics.density; // density에는 dip/160 값이 들어 있음.

 

여기서 참고 하실점은 density의 데이터 타입은 float형 입니다.  

DP -> PX를 하는 과정에서 좀 더 정확한 px값을 얻기 위해

Google Developers Site 에서는 반올림을 하여 처리하기를 권합니다.

 

int dp = 10;
int px = ( dp * density + 0.5 );

 

반응형