brunch

You can make anything
by writing

C.S.Lewis

by 김효진 Dec 01. 2020

안드로이드 DP, SP, PX, DPI

Android Developer

Android는 다양한 기기에서 실행되며, 이들 기기의 화면 크기와 밀도는 다양하다. 시스템은 다양한 화면에 맞게 사용자 인터페이스를 맞추기 위해 기본적인 배율 조정과 크기 변경을 수행하지만 각 화면 유형에 맞게 UI가 매끄럽게 표시되도록 하려면 추가적인 작업을 수행해야 한다. 






01

스크린의 실제 단위 px


픽셀 밀도는 화면의 실제 영역 내에 있는 픽셀 수이며 dpi(dot per inch)라고 불린다. 이 밀도는 화면상의 총 픽셀 수인 해상도와는 다르다. 

Android 기기는 다양한 화면 크기(핸드폰, 태블릿, TV 등)로 제공될 뿐만 아니라 화면의 픽셀 크기도 다양하다. 즉 한 기기에서는 제곱인치 당 160px을 사용하지만 다른 기기에서는 같은 공산에 480px을 사용한다. 이러한 픽셀 밀도의 편차를 고려하지 않으면 시스템이 이미지를 확장하거나(결과적으로 이미지가 흐려짐) 이미지가 완전히 잘못된 크기로 표시될 수 있다.

px는 화면을 구성하는 최소 단위이다. px 단위는 화면의 전체 화면 크기와 상관없이 지정한 수치만큼 표시되는 절대적 표시 단위이므로 안드로이드에서는 px보다는 dp단위를 사용하면 좋다.






02

dpi


dpi는 Dot Per Inch로 1인치에 들어가는 픽셀을 나타내는 단위이다.

예를 들면 100 dpi는 1인치당 픽셀이 100개 포함된다는 것을 말한다.

개수가 많을수록 고밀도이며 안드로이드에서 주요 dpi는 아래와 같다.


▪ 1 dpi ➞ 저밀도(ldpi)의 화면(120 dpi)에 대한 리소스

mdpi ➞ 중밀도(ldpi)의 화면(160 dpi)에 대한 리소스  ✔기준 밀도

▪ hdpi ➞ 고밀도(ldpi)의 화면(240 dpi)에 대한 리소스

▪ xhdpi ➞ 초고밀도(ldpi)의 화면(320 dpi)에 대한 리소스

▪ xxhdpi ➞ 초초 고밀도(ldpi)의 화면(480 dpi)에 대한 리소스

▪ xxxhdpi ➞ 초초 초고밀도(ldpi)의 화면(640 dpi)에 대한 리소스


안드로이드의 기준 dpi는 160 dpi이다.

160 dpi인 경우 밀도 독립 단위 dp와 px이 같은 크기를 갖는다.

즉, 160 dpi에서 1dp는 1px이 된다.






03

픽셀 독립형 픽셀 dp


dp는 픽셀 독립 단위이다.

화면의 크기가 달라도 동일한 비율로 보여주기 위해 안드로이드에서 정의한 단위이며 큰 화면, 작은 화면에 상관없이 같은 크기로 나타난다.

맨 먼저 피해야 할 함정은 픽셀을 사용하여 거리나 크기를 정의하는 것이다.

픽셀로 크기를 정의하면 화면 크기에 따라 픽셀 밀도가 달라져 같은 개수의 픽셀이라도 기기가 다르면 실제 크기가 달라질 수 있으므로 문제가 된다. 

그림 1, 같은 크기의 두 화면에서 픽셀 수가 다를 수 있음

밀도가 서로 다른 화면에서 UI 표시 크기를 유지하려면 밀도 독립형 픽셀(dp)을 측정 단위로 사용해서 UI를 디자인해야 한다. 1dp는 중밀도 화면 (160 dpi, '기준'밀도)의 1px과 거의 동일한 가상 픽셀 단위이다. 안드로이드는 이 값을 밀도마다 적합한 px수로 변환한다.


예를 들어 그림 1의 두 기기를 보면 뷰 너비를 '100px'로 정의하면 뷰가 왼쪽 기기에서 훨씬 더 크게 표시된다. 따라서 '100 dpi'를 대신 사용하여 뷰가 두 화면에서 동일한 크기로 표시되도록 해야 한다.


그러나 텍스트 크기를 정의할 때는 확장 가능 픽셀(sp)을 단위로 사용해야 한다.(단, 레이아웃 크기에는 sp를 사용하지 않아야 함) sp 단위는 기본적으로 dp와 같은 크기이지만, 사용자가 선호하는 텍스트 크기에 따라 크기가 조절된다. 






04

dp 단위를 px 단위로 변환


일부 경우 크기를 dp 단위로 표시한 후 이를 픽셀로 변환해야 한다. 

px = dp * (단말 dpi / 기준 밀도 160)
dp = px * (기준 밀도 160 / 단말 dpi)

앱에서 사용자 손가락이 16px 이상 이동하면 스크롤 또는 플링 동작이 인식된다고 가정해 보면 기준 화면에서는 사용자가 손가락을 16 pixels / 160 dpi (2.5mm 또는 1/10 인치와 같음)만큼 이동해야 동작이 인식된다. 고밀도 화면(240 dpi)을 사용하는 기기에서는 사용자가 손가락을 16 pixels / 240 dpi(1.7mm 또는 1/15인치와 같음)만큼 이동해야 합니다. 거리가 훨씬 더 짧아지므로 앱이 사용자에게 더 민감해 보인다.






05

대체 비트 맴 제공


픽셀 밀도가 서로 다른 기기에서 좋은 그래픽 품질을 제공하기 위해서는 앱에 있는 각 비트맵에 관해 밀도 버킷마다 해당하는 해성 도로 하나씩 여러 개의 비트맵 버전을 제공해야 한다. 그렇지 않으면 Android가 비트맵 크기를 조정해 각 화면에서 동일한 표시 공간을 사용하도록 해야 하며 블러와 같은 크기 조정 아티팩트가 발생한다.

다양한 밀도 크기에서 비트 맨의 상대적 크기










브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari