안드로이드는 많은 기기에서 사용되고 있습니다. 스마트폰, TV, 테블릿, 등… 정말 다양한 기기에서 사용하는 만큼 화면 크기도 제각각입니다. 안드로이드는 이 문제를 해결하기 위해 화면 크기 별 자동으로 사이즈를 변환해주는 크기 단위를 도입합니다. 이 크기 단위에 대해서 언급하기 전에 몇 가지 필요한 지식들을 먼저 보고 가겠습니다.
DPI
1인치당 픽셀(점 dots)이 몇 개 들어가는지 표현하는 픽셀 밀도 단위(dots per inch)입니다. 100dpi는 1인치에 100개의 픽셀이 있다는 의미입니다. DPI가 크면 클 수록 더 촘촘하게 픽셀이 구성되어있다는 의미입니다. 그래서 같은 100px이더라도 DPI에 따라서 크기가 다르게 보일 것입니다.
화면 밀도 크기 분류
안드로이드에서는 화면 밀도 사이즈를 DPI에 따라 분류합니다.
밀도 크기 분류 | 최대 dpi |
---|---|
ldpi | ~120dpi |
mdpi | ~160dpi |
hdpi | ~240dpi |
xhdpi | ~320dpi |
xxhdpi | ~480dpi |
xxxhdpi | ~640dpi |
높은 dpi를 가진 화면일 수록 리소스를 더 크게 보여주어야 합니다. 예를 들어 200px을 100dpi에서 보면 2인치로 보일 것입니다. 하지만 200dpi에서 보면 1인치로 보입니다. 그래서 어떤 화면에서 보든지 사용자 입장에서 같은 크기로 볼 수 있도록 크기를 조절해주어야 합니다.
https://developer.android.com/training/multiscreen/screendensities
위와 같이 화면 밀도에 맞게 유동적으로 리소스의 크기를 바꿔주어야합니다. 그래서 안드로이드는 높은 DPI일 수록 배율을 높혀서 보여줍니다. (밀도 독립적인 단위를 사용한 경우)
밀도 크기 분류 | 배율 |
---|---|
ldpi | x0.75 |
mdpi | x1.0 |
hdpi | x1.5 |
xhdpi | x2.0 |
xxhdpi | x3.0 |
xxxhdpi | x4.0 |
mdpi가 기준이 되는 크기입니다. mdpi에서 100px이었다면, xhdpi에서는 200px로 보여줍니다. (물론 px가 아닌 dp/sp와 같은 밀도 독립적인 단위를 사용해야합니다.)
PX
픽셀 단위입니다. px단위는 위에서 언급한대로 기기의 dpi에 따라서 실제로 사용자에게 보이는 크기가 달라집니다. 그러므로 특수한 경우가 아니라면 px단위는 가급적 사용하지 마세요.
DP(DIP)
DP 또는 DIP(Density-independent Pixels)는 밀도에 영향을 받지 않는 크기 단위입니다. 즉 이 단위를 사용하면 어떤 밀도의 화면이든 실제로는 같은 크기로 보입니다. 160dpi(mdpi)화면을 기준으로 설계된 단위입니다. 즉 160dpi인 mdpi 화면에서는 1dp = 1px입니다. 다른 dpi에서의 배율은 위에 배율 테이블을 참고해주세요.
이 dp단위를 사용하면 안드로이드는 화면 밀도 크기에 맞게 자동으로 리소스의 사이즈를 결정해서 사용자에게 보여줍니다. 그래서 리소스나 뷰 등의 크기를 결정할 때 사용하면 좋습니다. 다만, 폰트 크기를 결정할 때는 아래의 sp단위를 사용하세요.
SP
SP단위는 DP와 유사합니다. 마찬가지로 밀도에 영향을 받지 않는 단위입니다. 다만, 사용자의 폰트 크기 설정에 영향을 받습니다. 그래서 폰트 크기에 적합한 단위입니다.