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 );
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'컴퓨터 > 안드로이드' 카테고리의 다른 글
[안드로이드] 외부저장소 파일 처리, 경로, 쓰기, 읽기 (0) | 2020.04.27 |
---|---|
[안드로이드] google maps api 사용하기 (0) | 2020.04.25 |
[안드로이드] 대화상자(Dialog) 사용하기 (0) | 2020.04.21 |
[안드로이드] 토스트(toast) 메시지 사용하기 (0) | 2020.04.21 |
[안드로이드] xml을 이용해 컨텍스트 메뉴(ContextMenu) 사용하기 (0) | 2020.04.20 |