- 안드로이드 레이아웃과 관련된 기본적인 내용이지만, 조금만 응용해야할 때 잘 모르기 때문이다.
- 기본적인 내용을 정리하고 숙지하고, 디자이너와의 협업이 좀 더 수월했으면 하는 마음으로 공부한다.
-
density independent pixel 의 줄임말로 직역하면 밀도에 독립된 픽셀 이다.
-
안드로이드에서 화면을 그릴 때 사용하는 크기의 단위이다.
-
다른 클라이언트 단과 다르게 안드로이드는 레이아웃을 그릴 때 단위가 px 이 아닌 dp 단위로 동작한다.
- 다양한 크기의 해상도를 가진 기기들을 지원하기 위해서 이다. 픽셀 단위로 지정하면 서로 다른 크기의 화면에서 동일한 크기로 보여줄 수 없기 때문이다.
- 해상도가 다른 기기에서도 일정한 크기로 보여야 view 의 구성이 의도한대로 보여줄 수 있다.
이것을 설명하기 전 dpi 라는 개념을 먼저 알고 넘어가야 한다.
- dots per inch 의 줄임말로, 1인치당 픽셀 수 이다.
- 물리적인 단위인 인치에 몇 픽셀이 들어가는지에 대한 단위이다.
- Low density (120dpi) : ldpi
- Medium density (160dpi) : mdpi (기본)
- High density (240dpi) : hdpi
- Extra High density (320dpi) : xdpi
- xxhdpi : 480dpi
- xxxhdpi : 640dpi
- dp = px / (기기의 dpi / 기본(160(mdpi)))
- px = dp * (기기의 dpi / 기본(160(mdpi)))
이 dpi 를 기준으로 px 을 바꿔가며 화면에 나타내기 때문에, 다른 크기의 기기에서도 일정한 크기의 화면이 나타날 수 있다.
지정된 크기가 1dp 일때 mdpi 와 hdpi 는 위의 공식에 의해 계산 하면 각각 1px / 1.5px 의 크기로 화면에 그려진다.
-
개발자가 XML 에 디자인 파일의 크기대로 지정한다. (xml 작성할 때는 dp 로 지정)
-
앱을 구동하면 지정한 dp를 기기의 dpi 에 따라 계산 후 px 로 변환하여 화면을 나타낸다.
- 이해가 쉽게 상황을 예시로 들자면 아래와 같은 경우가 있다.
- 상품에 대한 필터를 제공해야하는데, 필터의 값이 매번 바뀌어 서버에서 가져온 후 화면을 그려야 하는 상황 이 때 필터를 담을 UI 는 미리 그려둘 수 있지만, 여백은 지정할 수가 없다. (몇개가 서버에 존재할지 모르기 때문이다. 여백을 미리 지정하면 화면에 나타난 마지막 필터는 의미 없는 여백을 가지게 되고 화면에 정렬이 맞아보이지 않게 나타난다.)
- 개발자가 필터를 그릴 때 추가할 여백 값을 코드로 지정한다.
- 해당 여백 값이 안드로이드의 동작을 담당하는 코드(kotlin or java) 상에서는 px 로 바로 처리가 되기 때문에 dpToPx() 과 같은 util 함수를 만들어서 계산된 px 값을 할당해준다. 해당 함수에는 위의 변환법 공식을 코드로 풀어놓은 부분이 포함 된다.
- 글자 크기도 dp 로 지정이 가능하지만 sp 로 지정하는 것을 권장한다.
-
Scale Independent Pixels 의 약어이다.
-
이는 사용자의 시스템 설정 값에 영향을 받는다. 사용자의 시스템 폰트 크기 지정(ex.크게, 작게 등)에 따라 앱 내 텍스트 크기가 정해진다. 기본적으로 지정해둔 크기도 단위를 sp로 지정할 경우 사용자의 시스템 폰트 크기에 따라 다르게 보이기도 한다.
-
사용자의 사용성을 높이기 위해 대부분 글자 크기는 sp 지정을 권장한다.
-
다만 특수성을 띄는 문구들은 일관적으로 제공을 하기 위해서 dp 로 지정하기도 한다.