2013년 6월 6일 목요일

DIP (Density Independent Pixels)

PX(Pixel)은 화면에 표시할 수 있는 최소한의 단위이다.

PX 의 크기는 물리적으로 아주 작지만 해상도마다 크기가 다르다.

DPI (Dot per inch) 는 1인치 안에 들어있는데 픽셀의 개수를 나타낸다.

160 dpi 는 1인치에 160 개의 픽셀이 존재한다고 보면 된다.

해상도가 높을 수록 픽셀의 물리적 크기는 더욱 작아진다.
 - 결국 더 세밀하게 표현할 수 있다.

DIP (Density independent pixels) 는 해상도에 상관없이 물리적으로 같은 크기의 출력을 원할 때 사용한다.

안드로이드 앱에 여러 해상도 별로 보여줄 이미지를 제공할 수 있다.
ldpi (low dpi), mdpi (medium dpi), hdpi (high dpi), xhdpi (xhigh dpi)  ...
 - 이런 기능을 제공하는 이유는 물론 여러 해상도에서 물리적으로 항상 같은 크기의 영역에 이미지 등을 화면에 출력하기 위해서 이다.

코드상으로 화면에 view 를 출력하거나 직접 그리기 위해서는 PX 단위를 이용해야 한다.

dip 값을 px 으로 변환하기 위해서는 일반 dpi 와 현재 화면의 dpi 의 비율을 나타내는 density 값을 이용해야 한다.

안드로이드의 기본 dpi 는 mdpi (medium dpi, 160 dpi) 이다.
 - mdpi 에서는 100dp = 100px 이다.
 - 즉 mdpi 에서 density 는 1 이다.

ldpi (low dpi, 120dpi) 에서는 100dp = 75px 이다.
 - density 는 120 / 160 = 0.75 이다.

Density 얻기
Context 의 getResources().getDisplayMetrics().density 값

Dip 단위를 px 로 변환
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100f, getResources().getDisplayMetrics());


사실 mdpi 라고 해서 무조건 160dpi 인거는 아니다.
그리고 x 축과 y 축의 dpi 가 다를 수 있다.

더 정확하게 계산하기 위해서 x 축 dpi 와 y 축 dpi 를 이용해야 한다.

float xdensity = getResrouces().getDisplayMetrics().xdpi / 160f;
float ydensity = getResrouces().getDisplayMetrics().ydpi / 160f;

댓글 없음:

댓글 쓰기