안드로이드 개발을 하다보면 어플리케이션에 이미지를 넣을 때 dp개념이 등장한다. 주로 안드로이드 디자인 측면에서 많이 사용되지만, 개발자가 알아두어도 도움이 될 것 같아서 글을 작성하게 되었다.
dp가 무엇인지, 안드로이드에서는 왜 dp 개념을 사용하는지 알아보자.
우선, dp에 대해 설명하기 전에 pixel이 무엇인지 먼저 알아야 한다.
픽셀(pixel, px)
화소라고도 하며, 디지털 이미지를 나타내는 데 사용되는 최소 단위이다.
픽셀은 해상도와도 관련이 있는데, 동일한 이미지라 하더라도 픽셀의 수가 많은 것이 해상도가 더 높다.
아래에서 오른쪽 그림이 왼쪽 그림보다 1인치당 픽셀 수가 더 많으므로 해상도가 높다고 볼 수 있다.
ppi는 pixel per inch -> 1인치당 픽셀 수를 의미한다.
혹은 dpi라고도 하는데, dpi : dot per inch를 뜻하는 것으로, dot이 곧 pixel이다.
그런데 안드로이드에서 어플리케이션에 이미지를 넣을 때, 픽셀 단위로 이미지를 넣으면 문제가 있다.
사용자의 스마트폰은 화면의 크기가 다 제각각이다. 따라서 같은 이미지라 하더라도 화면의 크기에 따라서 이미지가 크게 보일수도, 작게 보일수도 있다. 즉, 화면에 보이는 이미지 크기에 일관성이 없다는 문제점이 생기게 된다.
아래 그림은 5x5 픽셀 단위의 이미지를 해상도가 다른 A와 B에 나타낸 것이다.
B가 A보다 픽셀의 수가 많고 촘촘하므로 A에 비해 해상도가 더 높다.
동일한 이미지임에도 불구하고, A와 B의 해상도가 다르기 때문에 이미지의 크기가 다르게 나타난다는 것을 확인할 수 있다.
이러한 문제를 해결하기 위해 안드로이드에서는 픽셀 대신 dp를 단위로 하여 이미지를 지정한다.
dp(dip)
dp는 dip라고도 하며, Density-Independent Pixel의 약자이다.
직역하면 "밀도에 독립적인 픽셀"이라는 뜻이다. 위에서 픽셀(px)은 밀도에 독립적이지 못하다고 볼 수 있다. 픽셀이 촘촘한 경우와 그렇지 않은 경우에 이미지의 크기가 다르게 표시되기 때문이다.
반면, dp가 밀도에 독립적이라는 것은 해상도에 관계 없이 이미지를 같은 비율로 표현한다는 의미가 된다.
그렇다면 dp는 어떻게 해서 해상도에 관계 없이 동일한 비율로 표시될 수 있을까?
dp는 160dpi를 갖는 화면에서 하나의 픽셀과 대응한다.
160dpi는 보통 320x480 크기의 해상도를 가지는 3.6인치 스크린을 말하는데, 1인치당 160개의 픽셀을 가지고 있다는 뜻이다.
이 160dpi 해상도에서 1dp는 1pixel이다.
그리고 160dpi 해상도를 기준으로, 화면의 해상도에 따라 1dp이 나타내는 픽셀의 수는 달라진다.
160dpi 해상도를 갖는 화면에서 1dp = 1pixel 이다.
240dpi 해상도를 갖는 화면에서는 1dp = 1.5pixel 이다. -> 160dpi : 240dpi = 1pixel : 1.5pixel
320dpi 해상도를 갖는 화면에서는 1dp = 2pixel 이다. -> 160dpi : 320dpi = 1pixel : 2pixel
480dpi 해상도를 갖는 화면에서 1dp = 3pixel이다. -> 160dpi : 480dpi = 1pixel : 3pixel
해상도에 따른 dp와 pixel 관계를 구하는 공식은 다음과 같다.
dp = px * (160dpi / 단말dpi)
px = dp * (단말dpi / 160dpi)
ex) 640dpi에서의 1dp와 픽셀의 관계를 구하려면?
px = dp * (단말dpi / 160dpi)
-> px = 1 * (640/160) = 1 * 4 = 4
-> px = 4
즉, 640dpi 화면에서 dp = 1 일 때, px = 4에 대응된다.
아래 그림을 보자.
이번에는 이미지를 px단위가 아닌 dp단위로 표현하여 layout_width = "3dp", layout_height="3dp" 로
지정했다고 하자.
A에서는 1dp = 1pixel 이지만, B에서는 1dp = 4pixel이 된다. 따라서 A 해상도에서 이미지는 가로 3픽셀, 세로 3픽셀로 표현되고, B 해상도에서 이미지는 가로 6픽셀, 세로 6픽셀로 표현된다.
그러나 이미지의 비율은 A와 B에서 동일하다. 둘 다 가로세로 3dp로 지정했기 때문이다.
정리하면, 안드로이드에서는 화면의 크기에 관계없이 이미지의 비율을 동일하게 만들고자 픽셀 대신 dp개념을 적용한다. dp는 해상도에 독립적이기 때문이다. 160dpi 를 기준 해상도로 정하고, 화면 해상도에 따라서 1dp가 표현하는 픽셀의 수는 다르게 나타난다. 따라서 dp단위로 표현된 이미지는 해상도가 달라도 그 비율을 동일하게 유지시킬 수 있다.
안드로이드에서는 dpi별로 나누어서 기준을 제공하고 있다.
따라서 안드로이드 개발에서 이미지를 저장할 때는 이 기준대로 동일 이미지를 해상도별로 여러개 저장하는 것이 좋다.
- ldpi(low density) : 120dpi
- mdpi(medium density) : 160dpi (기준)
- hdpi(high density) : 240dpi
- xhdpi(extra high density) : 320dpi
- xxhdpi(extra extra high density) : 640dpi
'Android' 카테고리의 다른 글
[Android] Context 란? (0) | 2021.04.08 |
---|---|
[Android] 안드로이드 4대 컴포넌트 (0) | 2021.04.06 |
[Android] 안드로이드 생명 주기 (0) | 2021.03.08 |