안드로이드 개발을 하다보면 이 화면을 많이 보셨을 거에요.
이렇게나 많은 단위들이 있지만 보통 dp와 sp를 많이 사용하기에 별로 신경을 안 쓰고 있었는데요.
이번에 DP와 SP에 대해 정리하며 다른 단위들도 간단하게 설명하고자 합니다.
1. DP ( Density-independent Pixel )
DP는 디스플레이의 해상도(밀도)와 상관없이 다룰 수 있는 단위라고 보시면 됩니다.
즉, 화면의 크기가 달라도 동일한 비율로 보여주기 위해 안드로이드에서 정의한 정확한 단위이며 큰 화면, 작은 화면에 상관없이 같은 크기로 나타냅니다.
사용중인 화면의 실제 밀도에 따라 시스템이 런타임에 dp단위의 모든 확대/축소를 투명하게 처리한다.
그래서 화면의 크기가 다양한 안드로이드에서는 dp가 자주 쓰이곤 하죠.
2. SP ( Scale-independent Pixels )
SP는 텍스트 크기를 정의하는 경우 자주 사용됩니다.
textSize = 16sp 이런식으로요.
이것도 dp와 마찬가지로 시스템이 화면의 실제 밀도에 따라서 확대/축소를 처리합니다.
그렇다면 왜 텍스트는 dp가 아닌 sp를 자주 사용하는 것일까요?
그 이유는 안드로이드 시스템 설정에 있습니다. 부모님들 스마트폰을 보시면 흔하게 보셨을텐데요. 글자 크기가 굉장히 크게 돼있죠! sp는 이러한 시스템 설정에서의 폰트 크기에 영향을 받습니다.
반면에 dp로 설정하게 되면 시스템 설정에서의 폰트 크기에 상관없이 일정한 크기를 유지합니다.
그렇기에 상황에 따라 일관성 있게 화면에서 똑같은 텍스트의 크기를 나타내야 한다면 dp를, 그렇지 않은 경우엔 sp를 사용하면 되겠습니다.
3. DPI ( Dot Per Inch )
맨 위에 스크린샷 화면에는 없지만 dpi라는 것도 들어보셨을 것 같아요.
DPI는 1인치에 들어가는 픽셀을 나타내는 단위인데요.
예를들면 100dpi는 1인치당 픽셀이 100개 포함된다는 것을 말합니다.
개수가 많을수록 고밀도이며 안드로이드에서 주요 dpi는 아래와 같습니다.
- ldpi : 120dpi
- mdpi : 160dpi (기본)
- hdpi : 240dpi
- xhdpi : 320dpi
- xxhdpi : 480dpi
- xxxhdpi : 640dpi
안드로이드의 기준 dpi는 160dpi입니다. 이 dpi를 기준으로 dp와 px을 계산해요.
px = dp * 단말 DPI/기본 160
dp = px * 기본 160/단말 DPI
mdpi 지원 단말일 경우 dpi는 160이므로 1dp*160/160 = 1px이 됩니다.
xxhdpi 지원 단말일 경우, 5dp를 1pixel로 계산하면
5dp * 480/160 = 15px 이므로 xxhdpi 단말의 5dp는 15px이 됩니다.
즉, layout_width="100dp"인 뷰는 중간 밀도 화면(mdpi)에서 100px로 측정되고 고밀도 화면에서는 시스템이 이것을 최대 150px로 확대하므로, 이 뷰는 화면에서 물리적으로 거의 동일한 공간을 차지합니다.
이러한 계산들을 작업하는데 좀 더 효율적으로 할 수 있는 툴들을 몇 개 소개할게요
- Android DP/PX converter: 각 화면 밀도 별로 dp를 pixel로 pixel을 dp로 확인할 수 있습니다.
- Pixplicity DP/PX converter: 각 화면 밀도 별로 pixel, dp, sp, mm, inch, pt로 계산 값을 확인 할 수 있습니다.
- Cracker9의 Unit Converter: 디자이너가 작업하면서 쓰기 유용한 포토샵 플러그인입니다.
4. PX( Pixel )
PX은 화면의 전체 화면 크기와 상관없이 지정한 수치만큼 표시되는 절대적 표시 단위입니다.
즉, 픽셀 단위로 크기를 정하게 되면 화면 밀도가 큰 스크린에서는 작게 보여지게 돼요.
이러한 이유로 안드로이드에서는 px은 잘 쓰이지 않고 위에서 말한 dp를 자주 사용합니다.
5. in, mm, pt
- in: 인치(inch) 기반의 물리적 스크린 크기
- mm: 밀리미터 기반의 물리적 스크린 크기
- pt: 화면 밀도와 상관없이 1pt는 물리적화면 크기의 1/72인치 입니다.
즉, 모든 기기에서 72pt는 1인치가 됩니다. dp와의 차이점은 dp는 화면 밀도에 따라서 항상 160dp가 1인치가 되지는 않는다는 것입니다.
'안드로이드' 카테고리의 다른 글
RecyclerView를 데코해보자 ! - ItemDecoration (0) | 2023.08.15 |
---|---|
TextView로 CustomButton을 만든다고!? (0) | 2023.08.15 |
Glide 관찰기 (Feat. 속도, 캐시) (0) | 2023.08.15 |
[ Android ] Proguard 초간단 정리 (0) | 2021.11.28 |
[ Android ] PNG와 SVG (0) | 2020.12.20 |