본문 바로가기
프로그래밍/Android

Density-independent pixels

by JLearn 2023. 4. 13.

밀도(Density)

화면밀도(Density)는 디바이스 화면에서 픽셀(Pixel)의 밀도를 의미합니다. 픽셀의 밀도는 DPI(Dots Per Inch) , 즉 1인치 당 몇개의 픽셀이 존재하는지를 말합니다. 160 DPI 화면은 1인치 당 160개의 픽셀로 구성되어 있다는 것을 의미합니다.

 

안드로이드에서 픽셀 단위를 직접 사용하게 되면 같은 크기의 UI 요소를 가진 두 개의 디바이스에서 고밀도 화면, 저밀도 화면에 따라 표현하려는 UI 요소가 작거나 크게 보일 수 있습니다.

 

※ 출처 : https://m2.material.io/design/layout/pixel-density.html#pixel-density


이를 해결하기 위해 Android에서는 밀도 독립적 픽셀(DIP: Density-independent pixels, DP)을 사용하여 UI 요소의 크기를 지정합니다. DP는 화면밀도와 상관없이 일정한 크기로 보이도록 하기 때문에 따라서 DP를 사용하면 고밀도와 저밀도의 화면에서도 일관된 UI가 보여집니다.

 

밀도(Density)와 해상도(Resolution)와의 관계

해상도는 이미지나 화면의 표시 능력으로 픽셀단위로 표시됩니다. 더 높은 해상도는 더 많은 픽셀을 가진다는 것을 의미합니다. Full HD(1920x1080)와 Quad HD(2560x1440)는 각각 1920x1080, 2560x1440의 픽셀을 가진 화면을 말합니다.

밀도는 화면의 물리적인 크기와 해상도 사이의 관계를 나타내는 것으로 위에서 설명한것과 같이  안드로이드에서는 밀도 독립적 픽셀(DP)이라는 개념을 사용하여 서로 다른 밀도를 가진 디스플레이에서 동일한 크기의 UI를 표시할 수 있도록 합니다. DP는 단말기의 밀도에 따라 픽셀로 변환되어 표시됩니다.

 

drawable 디렉토리

안드로이드 앱에서 그래픽 자원을 관리하기 위해 drawable 디렉토리를 사용합니다. 이 디렉토리에는 이미지, 아이콘등을 포함한 다양한 그래픽 관련 파일이 저장되며 디바이스의 밀도에 따라 다른 크기의 그래픽 자원을 사용할 수 있도록 각각의 밀도에 맞는 drawable 디렉토리들이 존재합니다.

 

  • drawable-mdpi: 중밀도 화면을 위한 디렉토리
  • drawable-hdpi: 고밀도 화면을 위한 디렉토리
  • drawable-xhdpi: 초고밀도 화면을 위한 디렉토리
  • drawable-xxhdpi: xx고밀도 화면을 위한 디렉토리
  • drawable-xxxhdpi: xxx고밀도 화면을 위한 디렉토리

※ DPI (Dots Per Inch) 
- mdpi : 160dpi(기본), hdpi : 240dpi, xhdpi : 320dpi, xxhdpi : 480dpi, xxxhdpi : 640dpi


각각의 디렉토리에는 동일한 파일명으로 존재해야 하며 안드로이드 시스템은 디바이스의 밀도에 따라 적절한 디렉토리에서 해당 파일을 선택하여 사용합니다. 밀도에 맞는 디렉토리 또는 파일이 존재하지 않으면 적절한 파일을 선택하여 화면에 UI요소를 보여지게 합니다.

 

자바소스의 DP 사용

DP는 자바 소스 코드에서 직접 사용할 수는 없습니다.
자바 소스 코드에서는 픽셀 또는 DPI를 사용하여 크기를 지정하고 UI 디자인 레이아웃 XML 파일에서는 DP를 사용하여 크기를 지정합니다.

안드로이드에서는 DP 단위를 자동으로 픽셀 값으로 변환하여 사용합니다. 자바 소스 코드에서 크기를 변환하는 코드를 작성하려면 안드로이드에서 제공하는 DP 값을 픽셀로 변환하는 함수를 사용하면 됩니다. 

// DisplayMetrics 가져오기
DisplayMetrics metrics = getResources().getDisplayMetrics();

// 16dp를 픽셀로 변환하기
float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, metrics);

'프로그래밍 > Android' 카테고리의 다른 글

액티비티(Activity) 생명주기  (0) 2023.04.15
Gradle 빌드 스크립트  (0) 2023.04.14
컨텍스트(Context)  (0) 2023.04.11
AndroidManifest.xml  (0) 2023.04.10
가상 디바이스(Virtual Device) 생성  (0) 2023.04.10

댓글