Study Record

다양한 픽셀 밀도 지원(기기에 따른 이미지 지원, sp, dp) 본문

안드로이드

다양한 픽셀 밀도 지원(기기에 따른 이미지 지원, sp, dp)

초코초코초코 2023. 6. 10. 23:29
728x90

😶 개요

android 기기종류에는 화면 크기가 다양하고 화면 픽셀 크기도 다양하다. 같은 크기더라도 제곱인치당 160 픽셀인 기기도 있고 480 픽셀인 기기도 있다.

 

따라서, 픽셀 밀도에 따른 편차를 고려하지 않으면 이미지가 잘못된 방식으로 표현될 수 있다.

 

android 개발 문서에서 참고한 같은 크기에 따른 밀도 차이

 

 

 

😶 밀도에 따른 대처법

안드로이드에서는 밀도에 따른 화면에서 UI 표시 크기를 유지하기 위해 dp (밀도 독립형 필셀) 단위를 사용한다. 중밀도 화면(160dpi) 에서 1dp 는 1px 과 거의 비슷한 가상 픽셀 단위이다.

 

android 는 각각 다른 밀도 화면에서 적절한 실제 픽셀 수로 변환한다. 다음 공식은 dp 를 px 로 바꾸는 변환 공식이다. (각 기기의 밀도 정도(dpi) 에 따라 px 가 달라진다.)

px = dp * (dpi / 160)

 

 

1. 뷰 크기나 뷰 사이의 간격을 지정할 때 dp 단위를 사용한다.

<Button android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/clickme"
    android:layout_marginTop="20dp" />

 

 

2. 텍스트의 크기를 지정할 때는 sp 를 사용한다.

sp 는 dp 는 기본적으로 같은 크기지만 사용자가 선호하는 텍스트 크기만큼 크기가 조절된다. 따라서 텍스트 크기는 sp 를 사용하는 것이 좋다.

<TextView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="20sp" />

 

 

3. 픽셀 밀도에 따라 대체 비트맵을 제공한다.

픽셀 밀도가 서로 다른 비트맵(이미지)를 준비하여 제공되는 리소스 구성 한정자를 가진 디렉터리에 관리한다.

 

밀도 한정자 설명
ldpi 저밀도(~120dpi)
mdpi 중밀도(~160dpi) , 기준 밀도
hdpi 고밀도(~240dpi)
xhdpi 초고밀도(~320dpi)
xxhdpi 초초고밀도(~480dpi)
xxxhdpi 초초초고밀도(~640dpi)
anydpi 어떤 밀도로도 조정 가능한 리소스
nodpi 화면의 픽셀 밀도와 관계없이 조정할 수 없는 리소스로 모든 밀도에 대한 리소스이다. 

 

비트맵 리소스는 보통 res/drawable 디렉터리에 저장된다. 예를 들어, 밀도 한정자를 붙인 drawable-xxhdpi 디렉터리를 만들고 동일한 이름의 비트맵 저장하면 안드로이드 시스템이 밀도마다 적당한 디렉터리를 찾아 사용한다. 

 res/
  drawable-xxxhdpi/
    awesome-image.png
  drawable-xxhdpi/
    awesome-image.png
  drawable-xhdpi/
    awesome-image.png
  drawable-hdpi/
    awesome-image.png
  drawable-mdpi/
    awesome-image.png

 

기기 밀도에 다른 리소스를 제공하지 않으면 시스템이 화면에 맞게 크기를 조정한다. (nodpi 에 있는 리소스는 크기를 조정하지 않는다.) 

 

nodpi 한정자가 있는 리소스 디렉터리

시스템에서 현재 화면의 밀도를 기반으로 앱의 밀도별 리소스를 사용한다. 올바른 밀도의 리소스를 사용할 수 없다면 시스템은 기본 리소스를 로드하고 필요에 따라 리소스를 확장하거나 축소한다. 현재 화면의 밀도 한정자에 저장된 리소스가 존재하지 않는다면 예를 들어, mdpi 화면에 맞게 50*50픽셀로 디자인한 비트맵 리소스는 저장되어 있지만 hdpi 화면에 맞는 리소스는 제공하지 않는다고 가정했을 때,  hdpi 화면을 제공하는 기기에서는 75*75픽셀로 자동으로 크기를 조정하려고 할 것이다.

 

이 과정을 리소스 사전 크기 조정이라고 부른다. 어떤 경우에도 리소스 크기를 사전에 자동으로 조정하지 않게 하려는 상황이 있을 수 있다. 그럴 때는 nodpi 구성 한정자가 있는 리소스 디렉터리에 리소스를 넣으면 된다.

 

 

리소스 밀도 변경하기 (Resource Manager)

리소스의 밀도를 변경하고 싶을 때 Resource Manager 를 사용하면 간단하게 변경할 수 있다. 

View > Tools Windows > Resource Manager 를 클릭하고 + 버튼의 Import Drawables 를 선택하고 현재 프로젝트 경로를 선택하면 다음과 같이 현재 프로젝트에 대한 리소스 정보가 나오는데 그 중 Qualifier Type 을 Density 로 하고 value 값으로 원하는 밀도를 선택할 수 있다. value 값 중 No Density 는 nodpi 구성 한정자가 붙은 리소스 디렉터리로 이동한다.

 

4. 앱 아이콘

일부 앱 런처에서는 기본 정밀도에서 25% 더 크게 앱 아이콘을 표시한다. 예를 들면, 기기의 정밀도가 xxhdpi 이면 drawable-xxhdpi 가 아닌 drawable-xxxhdpi 에 있는 앱 아이콘을 사용하려고 한다.

 

따라서, 확장될 수 있는 앱 아이콘을 위한 mipmap 디렉터리가 있다. 밀도별 APK 를 빌드하더라도 mipmap 디렉터리는 APK 에 따로 유지되어 앱이 최적 해상도의 아이콘을 선택하여 홈 화면에 표시할 수 있다.

res/
  mipmap-xxxhdpi/
    launcher-icon.png
  mipmap-xxhdpi/
    launcher-icon.png
  mipmap-xhdpi/
    launcher-icon.png
  mipmap-hdpi/
    launcher-icon.png
  mipmap-mdpi/
    launcher-icon.png

 

 

😶 벡터 그래픽(SVG 파일)

위에서 설명한 이미지를 여러 버저으로 준비하는 대신 백터 그래픽 하나를 사용할 수 있다. 백터 그래픽은 비트맵이 아닌 xml 를 사용하여 이미지를 만들기 때문에 조정하지 않고 원하는 크기로 확장할 수 있다.

 

안드로이드에서는 SVG(벡터 그래픽) 파일은 지원하지 않으므로 Android 스튜디오에서 Vector Asset Studio 를 사용하여 안드로이드에서 사용할 수 있는 벡터 드로어블(.xml)로 쉽게 변환할 수 있다.

 

 

 

 

다양한 픽셀 밀도 지원  |  Android 개발자  |  Android Developers

다양한 픽셀 밀도 지원 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 기기는 다양한 화면 크기(핸드셋, 태블릿, TV 등)로 제공될 뿐만 아니라 화면의

developer.android.com

 

Resource Manager를 사용하여 앱의 UI 리소스 관리하기  |  Android 스튜디오  |  Android Developers

Resource Manager를 사용하여 앱의 UI 리소스 관리하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Resource Manage는 앱에서 리소스를 가져오고 만들고 관리하고

developer.android.com

 

728x90

'안드로이드' 카테고리의 다른 글

[안드로이드] Activity 와 layout 파일  (0) 2023.06.11
[안드로이드] 매니패스트 개요  (0) 2023.06.11
앱 리소스와 관리  (0) 2023.06.09
개인 정보 처리 방침  (0) 2023.05.20
[안드로이드] AlarmManager  (0) 2022.05.26