1. 리소스의 종류와 특징
안드로이드 앱 개발에서 리소스란 정적인 자원이라고 할 수 있습니다. 앱에서 사용하는 리소스는 크게 앱 리소스와 플랫폼 리소스로 구분됩니다.
앱 리소스 사용하기
앱 리소스란 개발자가 직접 추가한 리소스를 의미합니다. 앱을 개발하기 위해 모듈을 만들면 자동으로 res라는 디렉터리가 생기고 그 아래에 drawable, layout, mipmap, values라는 디렉터리 4개가 생성됩니다. 개발자는 이 리소스 디렉터리에 리소스 파일을 각각 만듭니다.
모듈을 만들면 기본으로 디렉터리 4개가 만들어지지만 리소스 파일의 종류는 더 많습니다. 즉, 기본 디렉터리뿐만 아니라 더 많은 디렉터리를 res 아래에 만들어 쓸 수 있습니다. 안드로이드 앱에서 이용되는 리소스의 종류를 정리해 보면 아래와 같습니다.
디렉터리명 | 리소스 종류 |
animator | 속성 애니메이션 XML |
anim | 트윈 애니메이션 XML |
color | 색상 상태 목록 정의 XML |
drawable | 이미지 리소스 |
mipmap | 앱 실행 아이콘 리소스 |
layout | 레이아웃 XML |
menu | 메뉴 구성 XML |
raw | 원시 형태로 이용되는 리소스 파일 |
values | 단순 값으로 이용되는 리소스 |
xml | 특정 디렉터리가 정의되지 않은 나머지 XML 파일 |
font | 글꼴 리소스 |
리소스 디렉터리와 파일은 이름을 지을 떄 규칙이 있습니다. 위 표에서 소개한 리소스 디렉터리명은 고정이며 res 디렉터리 아래에 개발자가 임의로 이름을 붙인 디렉터리를 만들 수 없고 하위 디렉터리 역시 추가할 수 없습니다. 또한 리소스 파일명은 values에 추가하는 파일을 제외하고는 모두 자바의 이름 작성 규칙을 지켜야 하며 알파벳 대문자를 사용할 수 없습니다.
이런 규칙이 있는 이유는 리소스 디렉터리와 파일을 코드에서 그대로 사용하지 않고 R 파일에 식별자로 등록해서 이용하기 때문입니다.
플랫폼 리소스 사용하기
개발자가 따로 준비하지 않아도 이미 안드로이드 플랫폼이 제공하는 많은 리소스가 있습니다. 앱을 개발할 때 이러한 플랫폼 리소스를 활용할 수 있습니다. 플랫폼 리소스는 안드로이드 스튜디오의 프로젝트 탐색 창에서 보기 옵션을 [Packages]로 설정한 후 [Libraries] 항목을 살펴보면 확인할 수 있습니다.
플랫폼의 라이브러리를 보면 anim, color, drawable 등 많은 리소스 디렉터리가 있습니다. 이곳에 있는 리소스가 플랫폼 리소스입니다.
플랫폼 리소스도 R파일에 등록된 식별자로 이용할 수 있습니다. 그런데 플랫폼 리소스는 앱에 있는 리소스가 아니므로 앱의 R 파일이 아니라 android.R이라는 플랫폼 라이브러리의 R파일에 등록되어 있습니다. 따라서 android.R 파일을 이용해 플랫폼 리소스를 이용할 수 있습니다.
XML에서 앱 리소스는 @ 기호로 R파일의 리소스를 이용했습니다. XML에서 drawable의 save.png 파일을 이용한다면 @drawable/save 처럼 작성합니다. 그런데 플랫폼의 리소스를 XML에서 이용할 때는 @android: 패턴으로 합니다. 예를 들어 플랫폼의 drawable 디렉터리에 save.png 파일이 있다면 @android:drawable/save 로 이용합니다.
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/alert_dark_frame" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@android:string/emptyPhoneNumber" />
2. 리소스 조건 설정
리소스 조건 설정이란 어떤 리소스를 특정 환경에서만 적용되도록 설정하는 것을 말합니다. 리소스를 이용할 때 왜 조건을 설정해야 하는지 앱 실행 아이콘을 예로 살펴보겠습니다.
예를 들어 개발자가 실행 아이콘을 48x48px 크기로 준비했다고 해봅시다. 이 앱을 mdpi 기기에 설치하면 아이콘이 선명하게 보입니다. mdpi 기기는 실행 아이콘을 48x48 크기로 출력하며 실제 아이콘도 48x48 이므로 선명하게 나오지요. 그런데 똑같은 앱을 hdpi 기기에 설치한다면 아이콘이 72x72 크기로 나옵니다. 즉, 48x48 크기의 아이콘을 72x72 크기로 늘려서 출력하므로 선명하지 않습니다. 그러므로 아이콘이 선명하게 나오게 하려면 이미지를 기기에 맞는 크기로 여러 장 준비할 수 밖에 없습니다. 기기별 실행 아이콘의 크기는 아래와 같습니다.
화면 밀도 | 크기 |
XXXHDPI | 192 x 192 |
XXHDPI | 144 x 144 |
XDHPI | 96 x 96 |
HDPI | 48 x 48 |
MDPI | 36 x 36 |
기기 크기별로 준비한 리소스를 코드에서 적용하지 않고 리소스 조건을 지정하여 자동으로 환경에 맞게 적용할 수 있습니다. 리소스 조건을 이용하려면 우선 아이콘의 파일명을 똑같이 지정해야 합니다. 모두 ic_launcher.png라는 파일명으로 만들면 R 파일에는 식별자가 하나만 생성됩니다. 그러므로 코드에서는 각 리소스를 구분할 필요 없이 R.mipmap.ic_launcher 라고 지정할 수 있습니다. 그런데 이렇게 하면 파일명이 중복되는 문제가 발생하는데 이때 디렉터리를 구분하여 해결합니다. 즉, 이름이 같은 파일을 하나의 디렉터리가 아니라 mipmap-mdpi, mipmap-hdpi 처럼 각각의 디렉터리에 담습니다.
이때 리소스 디렉터리 이름에서 붙임표(-) 뒤의 단어가 리소스의 조건입니다. 즉, 이 디렉터리의 리소스가 어느 때에 적용되어야 하는지를 명시하는 조건입니다. 예를들어 mipmap-mdpi 디렉터리는 mdpi라는 조건을 추가했으므로 mdpi 크기의 기기일 때에만 플랫폼이 알아서 적용해줍니다.
화면 회전에 대응하기
리소스 조건을 이용해 화면 회전에 대응하는 UI를 만들 수 있습니다. 스마트폰은 화면을 회전할 수 있는 기기이므로 방향에 따라 화면을 다르게 제공할 수 있습니다. 이처럼 화면 회전에 대응하려면 가로와 세로 방향일 때 출력할 레이아웃 XML 파일을 각각 준비해야 합니다. 그런데 어느 방향에서 어떤 XML 파일을 출력할지를 지정해야 합니다. 이를 코드로 구현할 수도 있지만 앞에서 다룬 리소스 조건으로 설정하여 처리하면 더 편리합니다.
우선 레이아웃 XML 파일을 다음과 같이 2개 만듭니다. 파일명은 모두 activity_main.xml 입니다.
<세로 방향 레이아웃 XML>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:src="@drawable/image1" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:src="@drawable/image2" />
</LinearLayout>
<가로 방향 레이아웃 XML>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/image1" />
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/image2" />
</LinearLayout>
세로 방향일 때 적용할 xml 은 layout 디렉터리에 저장하고, 가로 방향일 때 적용할 xml 은 layout-land 디렉터리에 저장해줍니다. layout 디렉터리에 있는 파일은 디렉터리명에 특정한 조건을 명시하지 않았으므로 기본값, 즉 세로 방향일 때 적용됩니다.



국제 언어 제공하기
글로벌 서비스를 제공하는 앱이라면 리소스 문자열을 각국 언어로 제공해야 합니다. 안드로이드에서는 이 부분도 리소스 조건 설정으로 처리합니다. strings.xml 파일에 <string> 태그로 문자열 리소스를 작성하는데, 이 파일을 여러 개 만들어서 각 언어에 맞는 리소스 문자열을 담고 어느 XML 파일을 적용해야 하는지를 리소스 디렉터리명으로 지정하면 됩니다.
<영어 문자열 리소스 예>
<resources>
<string name="app_name">Test9</string>
<string name="intro">Hello</string>
</resources>
<한국어 문자열 리소스 예>
<resources>
<string name="app_name">테스트9</string>
<string name="intro">안녕하세요</string>
</resources>
문자열 리소스는 values 디렉터리의 리소스이므로 식별자는 파일명이 아니라 <string> 태그의 name 값입니다. 따라서 각 파일에 문자열을 등록할 때 name 값은 똑같아야 합니다. 이 두 파일을 리소스 조건을 명시한 각각의 디렉터리에 만들면 됩니다.
3. 폰 크기의 호환성
안드로이드폰은 여러 제조업체에서 다양한 크기로 출시합니다. 그러므로 안드로이드 앱 개발자에게는 크기가 다양한 기기와 호환하는 화면을 만드는 것이 중요한 과제입니다. 폰 크기의 호환성은 안드로이드 시스템에서 도와주는 부분이 있고 개발자가 직접 코드에서 해결해야 하는 부분이 있습니다. 우선 안드로이드 시스템에서는 기기의 크기를 어떻게 판단하는지 살펴보겠습니다.
논리적인 단위 알아보기
안드로이드 시스템은 기기의 크기를 ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi로 구분합니다. 여기서 dpi는 dots per inch의 줄임말로 1인치 안에 있는 도트의 개수를 의미합니다.
크기 | 설명 |
ldpi | 저밀도 화면이며 ~ 120dpi |
mdpi | 중밀도 화면이며 ~ 160dpi |
hdpi | 고밀도 화면이며 ~ 240dpi |
xhdpi | 초고밀도 화면이며 ~ 320dpi |
xxhdpi | 초초고밀도 화면이며 ~ 480dpi |
xxxhdpi | 초초초고밀도 화면이며 ~ 640dpi |
안드로이드 시스템은 위 표처럼 기기의 크기를 구분하여 콘텐츠의 크기를 늘리거나 줄여서 그에 맞게 나올 수 있도록 돕습니다. 그런데 이 도움을 받으려면 개발자가 콘텐츠의 크기를 지정할 떄 논리적인 단위를 사용해야 합니다. 물리적인 단위로 지정하면 시스템의 도움을 받을 수 없습니다.
안드로이드에서 앱을 개발할 떄 크기 지정에 사용할 수 있는 단위는 다음과 같습니다.
- dp(dip: density-independent pixels): 스크린의 물리적 밀도에 기반을 둔 단위
- sp(sip: scale-independent pixels) : dp와 유사하며 글꼴 크기에 적용
- pt(points) : 스크린 크기의 1/72을 1pt로 함
- px : 픽셀
- mm : 밀리미터
- in : 인치
안드로이드에서는 논리적인 단위인 dp와 sp로 크기를 지정하길 권합니다. dp는 일반 크기, sp는 글꼴 크기를 의미합니다.
안드로이드 시스템은 mdpi 폰을 기준으로 크기를 조정하며 mdpi 폰에서 1dp는 1px입니다. 즉, 10dp로 지정하면 화면에 10px로 출력해 줍니다. dpi에 따른 배율은 다음과 같습니다.
크기 | 배율 |
ldpi | 0.75 |
mdpi | 1.0 |
hdpi | 1.5 |
xhdpi | 2.0 |
xxhdpi | 3.0 |
xxxhdpi | 4.0 |
xxhpid 폰은 개발자가 지정한 크기보다 3배 정도 크게 출력해 준다는 의미입니다.
'Android' 카테고리의 다른 글
[깡쌤의 안드로이드 프로그래밍 with 코틀린][4. 구글의 라이브러리로 화면 구성하기] 11. 제트팩 라이브러리 (0) | 2024.12.25 |
---|---|
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 10. 다이얼로그와 알림 이용하기 (0) | 2024.12.25 |
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 8. 사용자 이벤트 처리하기 (0) | 2024.12.25 |
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 7. 뷰를 배치하는 레이아웃 (0) | 2024.12.25 |
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 6. 뷰를 이용한 화면 구성 (0) | 2024.12.25 |
1. 리소스의 종류와 특징
안드로이드 앱 개발에서 리소스란 정적인 자원이라고 할 수 있습니다. 앱에서 사용하는 리소스는 크게 앱 리소스와 플랫폼 리소스로 구분됩니다.
앱 리소스 사용하기
앱 리소스란 개발자가 직접 추가한 리소스를 의미합니다. 앱을 개발하기 위해 모듈을 만들면 자동으로 res라는 디렉터리가 생기고 그 아래에 drawable, layout, mipmap, values라는 디렉터리 4개가 생성됩니다. 개발자는 이 리소스 디렉터리에 리소스 파일을 각각 만듭니다.
모듈을 만들면 기본으로 디렉터리 4개가 만들어지지만 리소스 파일의 종류는 더 많습니다. 즉, 기본 디렉터리뿐만 아니라 더 많은 디렉터리를 res 아래에 만들어 쓸 수 있습니다. 안드로이드 앱에서 이용되는 리소스의 종류를 정리해 보면 아래와 같습니다.
디렉터리명 | 리소스 종류 |
animator | 속성 애니메이션 XML |
anim | 트윈 애니메이션 XML |
color | 색상 상태 목록 정의 XML |
drawable | 이미지 리소스 |
mipmap | 앱 실행 아이콘 리소스 |
layout | 레이아웃 XML |
menu | 메뉴 구성 XML |
raw | 원시 형태로 이용되는 리소스 파일 |
values | 단순 값으로 이용되는 리소스 |
xml | 특정 디렉터리가 정의되지 않은 나머지 XML 파일 |
font | 글꼴 리소스 |
리소스 디렉터리와 파일은 이름을 지을 떄 규칙이 있습니다. 위 표에서 소개한 리소스 디렉터리명은 고정이며 res 디렉터리 아래에 개발자가 임의로 이름을 붙인 디렉터리를 만들 수 없고 하위 디렉터리 역시 추가할 수 없습니다. 또한 리소스 파일명은 values에 추가하는 파일을 제외하고는 모두 자바의 이름 작성 규칙을 지켜야 하며 알파벳 대문자를 사용할 수 없습니다.
이런 규칙이 있는 이유는 리소스 디렉터리와 파일을 코드에서 그대로 사용하지 않고 R 파일에 식별자로 등록해서 이용하기 때문입니다.
플랫폼 리소스 사용하기
개발자가 따로 준비하지 않아도 이미 안드로이드 플랫폼이 제공하는 많은 리소스가 있습니다. 앱을 개발할 때 이러한 플랫폼 리소스를 활용할 수 있습니다. 플랫폼 리소스는 안드로이드 스튜디오의 프로젝트 탐색 창에서 보기 옵션을 [Packages]로 설정한 후 [Libraries] 항목을 살펴보면 확인할 수 있습니다.
플랫폼의 라이브러리를 보면 anim, color, drawable 등 많은 리소스 디렉터리가 있습니다. 이곳에 있는 리소스가 플랫폼 리소스입니다.
플랫폼 리소스도 R파일에 등록된 식별자로 이용할 수 있습니다. 그런데 플랫폼 리소스는 앱에 있는 리소스가 아니므로 앱의 R 파일이 아니라 android.R이라는 플랫폼 라이브러리의 R파일에 등록되어 있습니다. 따라서 android.R 파일을 이용해 플랫폼 리소스를 이용할 수 있습니다.
XML에서 앱 리소스는 @ 기호로 R파일의 리소스를 이용했습니다. XML에서 drawable의 save.png 파일을 이용한다면 @drawable/save 처럼 작성합니다. 그런데 플랫폼의 리소스를 XML에서 이용할 때는 @android: 패턴으로 합니다. 예를 들어 플랫폼의 drawable 디렉터리에 save.png 파일이 있다면 @android:drawable/save 로 이용합니다.
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/alert_dark_frame" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@android:string/emptyPhoneNumber" />
2. 리소스 조건 설정
리소스 조건 설정이란 어떤 리소스를 특정 환경에서만 적용되도록 설정하는 것을 말합니다. 리소스를 이용할 때 왜 조건을 설정해야 하는지 앱 실행 아이콘을 예로 살펴보겠습니다.
예를 들어 개발자가 실행 아이콘을 48x48px 크기로 준비했다고 해봅시다. 이 앱을 mdpi 기기에 설치하면 아이콘이 선명하게 보입니다. mdpi 기기는 실행 아이콘을 48x48 크기로 출력하며 실제 아이콘도 48x48 이므로 선명하게 나오지요. 그런데 똑같은 앱을 hdpi 기기에 설치한다면 아이콘이 72x72 크기로 나옵니다. 즉, 48x48 크기의 아이콘을 72x72 크기로 늘려서 출력하므로 선명하지 않습니다. 그러므로 아이콘이 선명하게 나오게 하려면 이미지를 기기에 맞는 크기로 여러 장 준비할 수 밖에 없습니다. 기기별 실행 아이콘의 크기는 아래와 같습니다.
화면 밀도 | 크기 |
XXXHDPI | 192 x 192 |
XXHDPI | 144 x 144 |
XDHPI | 96 x 96 |
HDPI | 48 x 48 |
MDPI | 36 x 36 |
기기 크기별로 준비한 리소스를 코드에서 적용하지 않고 리소스 조건을 지정하여 자동으로 환경에 맞게 적용할 수 있습니다. 리소스 조건을 이용하려면 우선 아이콘의 파일명을 똑같이 지정해야 합니다. 모두 ic_launcher.png라는 파일명으로 만들면 R 파일에는 식별자가 하나만 생성됩니다. 그러므로 코드에서는 각 리소스를 구분할 필요 없이 R.mipmap.ic_launcher 라고 지정할 수 있습니다. 그런데 이렇게 하면 파일명이 중복되는 문제가 발생하는데 이때 디렉터리를 구분하여 해결합니다. 즉, 이름이 같은 파일을 하나의 디렉터리가 아니라 mipmap-mdpi, mipmap-hdpi 처럼 각각의 디렉터리에 담습니다.
이때 리소스 디렉터리 이름에서 붙임표(-) 뒤의 단어가 리소스의 조건입니다. 즉, 이 디렉터리의 리소스가 어느 때에 적용되어야 하는지를 명시하는 조건입니다. 예를들어 mipmap-mdpi 디렉터리는 mdpi라는 조건을 추가했으므로 mdpi 크기의 기기일 때에만 플랫폼이 알아서 적용해줍니다.
화면 회전에 대응하기
리소스 조건을 이용해 화면 회전에 대응하는 UI를 만들 수 있습니다. 스마트폰은 화면을 회전할 수 있는 기기이므로 방향에 따라 화면을 다르게 제공할 수 있습니다. 이처럼 화면 회전에 대응하려면 가로와 세로 방향일 때 출력할 레이아웃 XML 파일을 각각 준비해야 합니다. 그런데 어느 방향에서 어떤 XML 파일을 출력할지를 지정해야 합니다. 이를 코드로 구현할 수도 있지만 앞에서 다룬 리소스 조건으로 설정하여 처리하면 더 편리합니다.
우선 레이아웃 XML 파일을 다음과 같이 2개 만듭니다. 파일명은 모두 activity_main.xml 입니다.
<세로 방향 레이아웃 XML>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:src="@drawable/image1" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:src="@drawable/image2" />
</LinearLayout>
<가로 방향 레이아웃 XML>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/image1" />
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/image2" />
</LinearLayout>
세로 방향일 때 적용할 xml 은 layout 디렉터리에 저장하고, 가로 방향일 때 적용할 xml 은 layout-land 디렉터리에 저장해줍니다. layout 디렉터리에 있는 파일은 디렉터리명에 특정한 조건을 명시하지 않았으므로 기본값, 즉 세로 방향일 때 적용됩니다.



국제 언어 제공하기
글로벌 서비스를 제공하는 앱이라면 리소스 문자열을 각국 언어로 제공해야 합니다. 안드로이드에서는 이 부분도 리소스 조건 설정으로 처리합니다. strings.xml 파일에 <string> 태그로 문자열 리소스를 작성하는데, 이 파일을 여러 개 만들어서 각 언어에 맞는 리소스 문자열을 담고 어느 XML 파일을 적용해야 하는지를 리소스 디렉터리명으로 지정하면 됩니다.
<영어 문자열 리소스 예>
<resources>
<string name="app_name">Test9</string>
<string name="intro">Hello</string>
</resources>
<한국어 문자열 리소스 예>
<resources>
<string name="app_name">테스트9</string>
<string name="intro">안녕하세요</string>
</resources>
문자열 리소스는 values 디렉터리의 리소스이므로 식별자는 파일명이 아니라 <string> 태그의 name 값입니다. 따라서 각 파일에 문자열을 등록할 때 name 값은 똑같아야 합니다. 이 두 파일을 리소스 조건을 명시한 각각의 디렉터리에 만들면 됩니다.
3. 폰 크기의 호환성
안드로이드폰은 여러 제조업체에서 다양한 크기로 출시합니다. 그러므로 안드로이드 앱 개발자에게는 크기가 다양한 기기와 호환하는 화면을 만드는 것이 중요한 과제입니다. 폰 크기의 호환성은 안드로이드 시스템에서 도와주는 부분이 있고 개발자가 직접 코드에서 해결해야 하는 부분이 있습니다. 우선 안드로이드 시스템에서는 기기의 크기를 어떻게 판단하는지 살펴보겠습니다.
논리적인 단위 알아보기
안드로이드 시스템은 기기의 크기를 ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi로 구분합니다. 여기서 dpi는 dots per inch의 줄임말로 1인치 안에 있는 도트의 개수를 의미합니다.
크기 | 설명 |
ldpi | 저밀도 화면이며 ~ 120dpi |
mdpi | 중밀도 화면이며 ~ 160dpi |
hdpi | 고밀도 화면이며 ~ 240dpi |
xhdpi | 초고밀도 화면이며 ~ 320dpi |
xxhdpi | 초초고밀도 화면이며 ~ 480dpi |
xxxhdpi | 초초초고밀도 화면이며 ~ 640dpi |
안드로이드 시스템은 위 표처럼 기기의 크기를 구분하여 콘텐츠의 크기를 늘리거나 줄여서 그에 맞게 나올 수 있도록 돕습니다. 그런데 이 도움을 받으려면 개발자가 콘텐츠의 크기를 지정할 떄 논리적인 단위를 사용해야 합니다. 물리적인 단위로 지정하면 시스템의 도움을 받을 수 없습니다.
안드로이드에서 앱을 개발할 떄 크기 지정에 사용할 수 있는 단위는 다음과 같습니다.
- dp(dip: density-independent pixels): 스크린의 물리적 밀도에 기반을 둔 단위
- sp(sip: scale-independent pixels) : dp와 유사하며 글꼴 크기에 적용
- pt(points) : 스크린 크기의 1/72을 1pt로 함
- px : 픽셀
- mm : 밀리미터
- in : 인치
안드로이드에서는 논리적인 단위인 dp와 sp로 크기를 지정하길 권합니다. dp는 일반 크기, sp는 글꼴 크기를 의미합니다.
안드로이드 시스템은 mdpi 폰을 기준으로 크기를 조정하며 mdpi 폰에서 1dp는 1px입니다. 즉, 10dp로 지정하면 화면에 10px로 출력해 줍니다. dpi에 따른 배율은 다음과 같습니다.
크기 | 배율 |
ldpi | 0.75 |
mdpi | 1.0 |
hdpi | 1.5 |
xhdpi | 2.0 |
xxhdpi | 3.0 |
xxxhdpi | 4.0 |
xxhpid 폰은 개발자가 지정한 크기보다 3배 정도 크게 출력해 준다는 의미입니다.
'Android' 카테고리의 다른 글
[깡쌤의 안드로이드 프로그래밍 with 코틀린][4. 구글의 라이브러리로 화면 구성하기] 11. 제트팩 라이브러리 (0) | 2024.12.25 |
---|---|
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 10. 다이얼로그와 알림 이용하기 (0) | 2024.12.25 |
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 8. 사용자 이벤트 처리하기 (0) | 2024.12.25 |
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 7. 뷰를 배치하는 레이아웃 (0) | 2024.12.25 |
[깡쌤의 안드로이드 프로그래밍 with 코틀린][3. 앱의 기본 기능 구현하기] 6. 뷰를 이용한 화면 구성 (0) | 2024.12.25 |