이젠 정말 뷰를 짜는걸 넘어서 뷰가 어떻게 불러와지는지, 어떤식으로 처리하고 조절할지, 어떻게 더 최적화를 할 지 고민해봐야할 시기가 온 것 같다. 사실 이 주제는 필요할때마다 쫌쫌따리로 공부해왔던 주제라 인턴 입사 전 여유로울 때 꼭 시리즈로 뽀개봐야겠다고 결심했다.
이미지를 불러올때마다 glide나 coil의 다섯 줄 이내의 코드만으로 이미지로딩성공ㅋ 을 자신하는 나 자신에 부끄러움을 느끼곤 했다 ^^ 사실 uri 하나로 갑자기 앱에 사진이 불러와지는게 너무너무 신기한일이고 원리가 궁금하지않은가 ? 또, 이미지로더의 캐싱 원리가 궁금하기도 했다. 운영체제 공부를 하면서 캐시지옥에 빠져있기 때문에 ..... 아무튼 모든 시기가 딱 맞아떨어진 겸사겸사 포스팅이다. 항상 안드로이드 포스팅 주제는 진짜 신내림마냥 하늘에서 벼락맞듯이 주제가 내려오게 되는 듯하다. 그래서 한번 작성하면 너무 끝도 없어서 자주 못쓰는것 같기도 하지만 ...........
아무튼 이미지로더를 공부하려고 공식문서와 내부 코드들을 읽어봤는데 당연히 실패했고, 선수과정이 있어야함을 깨달았다 하하
1. 비트맵과 png jpg의 차이를 제대로 아는가 ..?
2. 그럼 그 전에 이를 구성하는 픽셀과 해상도를 제대로 아는가 ? ....
이 두개의 질문에 제대로 대답해야 이미지 로더 공부에 진입이 가능함을 깨달으며 시리즈 글로 작성해보고자한다.
오늘은 안드로이드 dp와 픽셀 단위, 해상도, dpi 에 대해서 알아보자.
DPI (Dot Per Inch)
먼저 dpi에 대해 알아보자. 그 이름처럼 1인치(2.54cm) 당 픽셀 수를 의미한다. 따라서 DPI가 높을수록 화면의 픽셀 밀도가 높아져 이미지와 텍스트가 더 선명하게 보인다. 안드로이드의 dpi는 다음과 같다.
- ldpi : 120dpi
- mdpi : 160dpi
- hdpi : 240dpi
- xdpi : 320dpi
- xxhdpi : 480dpi
- xxxhdpi : 640dpi
여기서 mdpi가 기준 dpi로, 160dpi일 경우 dp와 px이 같은 크기를 갖는다. 즉, 1dp가 1px이 된다.
해상도
그렇다면 안드로이드의 해상도는 무엇일까 ? dpi가 높으면 = 해상도가 높다 로 이해하기 쉽다. 실제로 안드로이드 에뮬레이터를 생성할때 dpi가 높으면 선명하길래 그렇게 착각하기도 했다. 둘은 같은 개념이라기 보다는 안드로이드 화면의 품질을 함께 결정하는 요소로 알아두자.
먼저 픽셀은 화면에서 가장 작은 단위의 점을 가리킨다는 점을 밝히고 넘어가자.
해상도는 화면의 전체 픽셀 수를 의미하며, 일반적으로 가로 픽셀 수와 세로 픽셀 수로 표현된다. 예를 들어, 1920x1080 해상도는 가로 1920픽셀, 세로 1080픽셀의 총 2073600 픽셀을 가진다. 따라서 높은 해상도는 더 많은 픽셀을 사용해 더 많은 디테일을 표현할 수 있어 노트북이나 스마트폰의 해상도가 높아질 때마다 이를 혁신이라고 표현하는 것이다. (참고로 4K는 3840x2160이다)
결론은 DPI와 해상도는 함께 작용하여 화면의 총 픽셀 수와 품질을 결정한다. 예를 들어, 같은 해상도의 화면이라도 DPI가 다르면 화면의 크기와 픽셀 밀도가 달라진다.
- DPI가 높을 때
- DPI가 높으면 동일한 해상도에서도 화면의 픽셀 밀도가 높아져, 화면의 요소가 더 선명하고 디테일하게 보인다.
- 예를 들어, 1920x1080 해상도의 화면이 160 DPI이면 큰 화면에 낮은 픽셀 밀도를 가진 반면, 320 DPI일 경우 작은 화면에서 높은 픽셀 밀도를 제공한다.
- 해상도가 높을 때
- 해상도가 높으면 더 많은 픽셀을 사용하여 화면에 더 많은 정보를 표시할 수 있지만, DPI와 함께 고려해야 한다
- DPI가 낮으면 큰 화면에서도 해상도의 장점을 제대로 활용하지 못할 수 있기 때문이다
요약하면, DPI는 화면의 픽셀 밀도를 측정하여 선명도를 결정하고, 해상도는 화면의 전체 픽셀 수를 측정하여 디테일을 결정한다.
dp (Density Independent Pixel)
그렇다면 안드로이드 개발에서 주로 쓰는 dp는 어떤 단위일까 ? 어렴풋이 픽셀하고 다르게 다양한 기기의 해상도를 지원한다고 알고 있는데 그 이유는 무엇일까 ? 바로 dp는 픽셀 독립 단위이기 때문이다. 따라서 DIP(Density Independent Pixel)라고도 한다.
dp 또한 이름그대로 밀도에 독립적인 픽셀이라는 뜻으로, 즉 해상도에 관계 없이 이미지를 같은 비율로 표현한다는 의미이다.
어떻게 가능할까 ? 바로 이 공식을 보면 된다
dp = px * (160dpi / 단말dpi)
px = dp * (단말dpi / 160dpi)
예를 들어, 640dpi에서의 1dp와 픽셀은 어떤 관계를 가질까 ?
px = dp * (단말dpi / 160dpi) -> px = 1 * (640/160) = 1 * 4 = 4
즉, 640dpi 화면에서 dp = 1 일 때, px = 4에 대응된다. 따라서 화면의 크기에 따라서 대응되는 값이 바뀌고, 이를 통해 비율이 유지된다.
이와 같이 안드로이드에서는 화면의 크기에 관계없이 이미지의 비율을 동일하게 만들고자 픽셀 대신 dp개념을 적용하고, 이게 우리가 마진이나 패딩, 이미지를 dp를 단위로 지정하는 이유이다.
안드로이드 레이아웃 세분화 - dimens.xml
res/values를 보면 dimens.xml 파일의 역할이 뭔지 한번쯤이 궁금했던 적이 있을것이다. 해당 파일이 바로 기기의 dpi 차이를 보완하기 위해 나온 파일이며, 이를 사용하면 다양한 화면 크기와 해상도에 맞춰 UI 요소의 크기와 간격을 일관되게 조절할 수 있다.
따라서 다양한 dpi에 따라 바뀌는 값들을 다음과 같이 정의해서 필요 시 사용한다.
- 기본값: res/values/dimens.xml — 기본 레이아웃 값
- 작은 화면: res/values-small/dimens.xml — 작은 화면 디바이스에 적합한 값
- 큰 화면: res/values-large/dimens.xml — 큰 화면 디바이스에 적합한 값
- 초고밀도 화면: res/values-xhdpi/dimens.xml, res/values-xxhdpi/dimens.xml 등 — 다양한 DPI에 맞는 값
'안드로이드 > 꺼진개념다시보기' 카테고리의 다른 글
[Android] 안드로이드 UI 어디까지 아는데 ? - (3) 이미지 로더 Glide의 원리 : with, load, into를 중심으로 (4) | 2024.10.13 |
---|---|
[Android] 안드로이드 UI 어디까지 아는데 ? - (2) 이미지 형식 : bitmap, vector, SVG, PNG (0) | 2024.08.25 |
[Android] viewModelScope, lifecycleScope과 repeatOnLifecycle (0) | 2024.07.10 |
[Android] Serializable, Parcelable (0) | 2024.07.07 |
[Android] 안드로이드의 UI 상태 저장, onSaveInstanceState (0) | 2024.07.07 |