본문 바로가기

카테고리 없음

안드로이드 dp와 px

dp (dip, density independent pixel) 은 안드로이드에서 여러 화면 크기를 서포트 해주기 위해서 만든 유닛이다.
만약 많은 화면에서 내가 만든 레이아웃이 제대로 보이길 원한다면 dp를 써서 화면을 만드는 것이 좋다.

우선 주의할 것은 안드로이드는 160dpi를 기본으로 생각한다.
이것은 (320 x 480) 스크린의 density를 나다내는 것이다.

그러므로 480 x 800  (240dpi)의 스크린을 dp로 나타낸다면 320 x 533 (480 / 1.5, 800 / 1.5) 이 된다.
dp를 이용해서 레이아웃을 잡을때 이 수치를 꼭 기억하고 잡자!
dp로 레이아웃을 잡을때 버튼을 4개 만들고 LinearLayout (horizontal)에 넣은뒤 
width를 80dp (80*4 = 320)로 잡으면 4개가 같은 넓이의 버튼이 된다.
하지만 480을 생각하고 120dp 라고 넓이를 잡으면 오른쪽 1개 버튼은 화면을 지나서 보이는걸 볼것 이다.

그렇다면 코드상에서 dp를 pixel로 바꾸려면 어떻게 해야할까?
식은 pixel = dp * (density / 160)

dp는 원하는 값이고 density 는 
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
outMetrics.densityDpi 
로 가지고 올 수 있다.

여기서 outMetrics.density 라는 변수가 있는데 이것은 (density / 160) 의 결과 값이 들어 있다.
그러므로 식은 
pixel = dp * outMetrics.density 
가 된다.

여기서 코드상에 dp를 pixel로 변한하는 식이 필요한 이유는,
안드로이드 레이아웃을 코드상에서 고치면 dp를 쓸 수 없기 때문이다.
모든 setWidth나 setHeight 등등은 인자를 pixel로 받는다.

*한가지 덧붙이자면, 안드로이드 개발자사이트에서 아래처럼 반올림 처리를 하더군요.
int pixel = (dp * outMetrics.density + 0.5);

* px = (dp * getContext().getResources().getDisplayMetrics().density + 0.5f);

*

dp와 px 단위간 변환

 DisplayMetrics outMetrics = new DisplayMetrics();

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

 float density = outMetrics.density;

px = dp * density