-
[Android Studio] 길이 단위 - dp, dpi, px, sp 의 차이점개발 끄적끄적/Android 2020. 6. 18. 15:19반응형
모바일 디바이스는 다양한 크기와 해상도를 가지고 있습니다. 현재 유통되고 있는 모든 기기의 크기, 화소를 계산해서 코딩하지 않으면 원하는 디자인을 유저에게 제공할 수 없게 됩니다. 이를 해결해주는 길이 단위에 대해 알아보겠습니다.
먼저 안드로이드에서 제공하는 길이 단위입니다.
1. px (pixel)
실제 픽셀 수를 뜻합니다. px을 이용하면 해상도가 다른 디바이스마다 실제 크기가 다르게 보이며 심지어 이미지가 깨질 수도 있습니다.
2. dp / dip (Density Independent Pixel)
화면의 크기를 기준으로 하며, 어떠한 화면의 해상도에도 같은 비율로 출력해줍니다. px만으로 다양한 디바이스의 해상도를 지원할 수 없기 때문에 자주 쓰입니다.
3. dpi (Dots per Inch)
1인치에 들어있는 픽셀 수를 뜻하며, 안드로이드에서는 160을 기본으로 합니다.
4. sp / sip (Scale Independent Pixel)
글꼴의 단위로 자주 쓰입니다. dp와 비슷하지만 사용자가 선택한 글꼴에 따라 달라집니다.
5. in (Inch)
실제 물리적인 길이(2.54cm)입니다.
6. mm (milli meter)
네. 생각하시는 그 mm 맞습니다. 실제 물리적인 길이입니다.
7. em
글꼴과 상관 없이 동일한 텍스트의 크기를 출력합니다.
안드로이드에서는 디바이스의 다양한 크기와 해상도를 지원하기 위해 DPI(Dots Per Inch) 라는 단위를 지원합니다.
DPI는 1인치당 몇 개의 도트를 가지는지에 대한 단위입니다. DPI 수치가 높을수록 1인치당 표현할 수 있는 도트가 많아지고, 선명한 이미지를 제공할 수 있는 것입니다.
1인치 안에 4개의 Pixel이 들어있는 디바이스가 있다고 가정하겠습니다. 이는 위 그림처럼 4DPI가 되고, 해당 디바이스에선 선명한 이미지를 출력하기는 어렵겠죠.
다음은 DPI에 따른 극단적인 예시입니다.
위와 같이 차이가 생깁니다. DPI가 낮을 경우 적은 픽셀을 가지고 원을 표현해야하는 반면, DPI가 높을 경우 많은 픽셀을 활용할 수 있으니 선명한 이미지를 제공할 수 있는 것입니다.
DPI가 높을수록 많은 픽셀을 있는 것입니다. 즉, DPI는 픽셀의 밀도라고 생각할 수 있습니다.
단위로 px를 사용하면 어떻게 될까요? 디바이스들은 각기 다른 해상도를 지니고 있기 때문에 실제로 출력되는 사이즈가 다 달라지는 것입니다.
같은 px로 설정한 이미지더라도 낮은 해상도의 기기에선 크게 보이고, 높은 해상도에선 작게 보이겠죠.
안드로이드에선 레이아웃의 크기 단위로 dp를 사용하길 권장하고 있습니다.
dp는 앞서 언급한대로 디바이스의 해상도와 상관없이 다룰 수 있는 단위입니다.
dp와 픽셀의 관계는 다음과 같이 정의할 수 있습니다.
px = dp * (해상도/160)
dp와 px의 단위 변환을 위해서는 다음과 같이 생각할 수 있습니다.
- px = dp * ( 디바이스 DPI / 160 )
- dp = px * ( 160 / 디바이스 DPI )
디바이스의 DPI는 어떻게 확인할 수 있을까요?
- LDPI = 120dpi
- MDPI = 160dpi
- HDPI = 240dpi
- XHDPI = 320dpi
- XXHDPI = 480dpi
- XXXHDPI = 640dpi
48dp 리듬이란?
Android 가이드라인에는 48dp 리듬을 가지고 디자인하라는 조언이 있습니다. 바로 Android UI 디자인 시 버튼의 크기를 48dp로 하라는 것입니다.
48dp는 앞서 배운 것을 토대로 약 7~10mm정도의 크기입니다. 이는 사용자가 터치했을 때 접촉하는 평균적인 크기입니다.
안드로이드 시스템이 디스플레이의 정확한 해상도를 반영하지 못하기 때문에 정확한 크기로 환산할 수 없습니다.
예를들어 갤럭시 S9의 해상도는 570dpi인데도 xxxhdpi 범주에 들어가기 때문에 640dpi에 해당하는 픽셀을 계산합니다.
이렇듯 조금씩의 오차가 생기기 때문에 대략적인 크기로 잡은 것입니다.
ui 디자인 시 이를 참고해서 디자인을 한다면 보다 사용성 높은 서비스를 제공할 수 있을 것으로 생각됩니다.
반응형'개발 끄적끄적 > Android' 카테고리의 다른 글
[Android Studio] Animation을 이용해 커스텀 로딩 창(Custom Dialog) 만들기 (0) 2020.06.25 [Android Studio] Animation - fade in & out(나타나기), move (움직이기) (0) 2020.06.18 [Android Studio] ImageView 속성 알아보기 - ScaleType & Background vs Src (0) 2020.06.18 [Android Studio] Context란? Context의 정의, 종류와 사용 방법 (1) 2020.06.05 [Android Studio] SQLite을 이용한 내장 DB 활용하기 (0) 2020.06.05