리소스 활용하기

이윤설·2024년 8월 27일
0

1. 리소스의 종류와 특징

1. 리소스의 종류와 특징

앱에서 이용하는 리소스는 크게 앱 리소스와 플랫폼 리소스로 구분된다.

앱 리소스

앱 리소스는 개발자가 직접 추가한 리소스를 의미하며, 주로 res 폴더 아래에 위치한다. 이 리소스들은 앱의 UI 구성과 기능 구현에 중요한 역할을 한다.

  • values: 재사용 가능한 값들을 모아두는 폴더로, 다양한 XML 파일이 포함된다. 예를 들어:

    • strings.xml: 앱에서 사용하는 문자열을 정의한다. 다국어 지원을 위해 사용된다.
    • colors.xml: 앱에서 사용할 색상을 정의한다. 색상 코드를 지정해 재사용하기 편리하다.
    • styles.xml: 앱의 테마와 스타일을 정의한다.
  • font: 커스텀 글꼴 파일을 저장하는 폴더다.

  • color: 앱에서 사용할 색상을 정의하는 폴더다. colors.xml 파일을 통해 색상 코드들을 지정하고 이름을 붙여, UI 구성에서 쉽게 참조할 수 있다.

플랫폼 리소스

플랫폼 리소스는 안드로이드 운영체제에서 기본적으로 제공하는 리소스를 의미한다. 예를 들어, 안드로이드의 기본 스타일, 색상, 아이콘 등이 포함되며, android.R 패키지를 통해 참조할 수 있다. 이러한 리소스는 앱 전반에서 일관된 디자인을 유지하거나 시스템의 기본 동작을 사용할 때 유용하다.


project -> packages -> libraries에서 원하는 앱 리소스를 사용할 수 있다.
플랫폼 리소스도 R 파일에 등록된 식별자로 사용할 수 있다.
그런데 플랫폼 리소스는 앱에 있는 리소스가 아니므로 앱의 R 파일이 아니라, android.R이라는 플랫폼 라이브러리의 R파일에 등록되어 있다.
따라서 android.R 파일을 이용해 플랫폼 리소스를 이용할 수 있다.


2. 리소스 조건 설정

리소스 조건 설정

안드로이드에서 리소스 조건 설정이란, 다양한 기기나 상황에 맞게 리소스를 동적으로 선택하고 제공하기 위해 리소스의 조건(qualifiers)을 설정하는 것을 의미한다. 이러한 조건을 통해 화면 크기, 해상도, 언어, API 레벨 등에 따라 다른 리소스를 사용할 수 있다.

개념

조건 설정은 res 폴더 하위의 서브 디렉토리에 조건(qualifiers)을 붙여 특정 환경에서만 사용할 리소스를 지정하는 방식이다.
예를 들어, 기기의 언어가 영어일 때와 한국어일 때 다른 문자열 리소스를 제공하거나, 화면 크기에 따라 다른 레이아웃을 적용하는 등의 작업이 가능하다.

주요 리소스 조건 설정 종류

조건 설정 (Qualifier)설명예시
화면 크기 (Screen Size)기기의 화면 크기에 따라 리소스를 분기res/layout-sw600dp/
화면 밀도 (Screen Density)기기의 해상도나 픽셀 밀도에 따라 이미지를 분기res/drawable-xhdpi/
화면 방향 (Screen Orientation)화면이 가로 또는 세로일 때 다른 레이아웃을 사용하도록 분기res/layout-land/
언어 및 지역 (Language and Region)언어 및 국가 설정에 따라 문자열 리소스를 분기res/values-ko/, res/values-en/
API 레벨 (API Level)특정 API 레벨 이상에서만 적용되는 리소스를 지정res/values-v21/
나이트 모드 (Night Mode)다크 모드와 라이트 모드에 따라 다른 리소스를 제공res/values-night/
최소 너비 (Smallest Width)기기의 최소 너비(dp)에 따라 레이아웃을 분기res/layout-sw720dp/

예시를 통한 리소스 조건 설정 이해

1. 화면 크기에 따른 레이아웃 설정

화면 크기에 따라 서로 다른 레이아웃을 제공하고 싶다면 다음과 같이 설정한다.

  • res/layout/activity_main.xml: 기본 레이아웃
  • res/layout-sw600dp/activity_main.xml: 너비가 600dp 이상인 기기에서 사용할 레이아웃

2. 언어에 따른 문자열 설정

앱이 다국어를 지원할 경우 언어에 따라 문자열을 다르게 설정할 수 있다:

  • res/values/strings.xml: 기본 언어(영어) 문자열
  • res/values-ko/strings.xml: 한국어로 된 문자열

3. 화면 밀도에 따른 이미지 설정

해상도나 화면 밀도에 따라 이미지 리소스를 분리하여 관리할 수 있다:

  • res/drawable-mdpi/: 중간 해상도 이미지
  • res/drawable-xhdpi/: 고해상도 이미지

리소스 선택의 우선순위

안드로이드 시스템은 리소스를 선택할 때 가장 구체적인 조건을 가진 리소스를 우선적으로 선택한다. 예를 들어, 기기가 sw600dpland 조건을 모두 만족할 경우, layout-sw600dp-land 폴더의 리소스를 사용한다.

리소스 조건 설정의 장점

  • 다양한 기기에서 최적의 사용자 경험을 제공할 수 있다.
  • 다국어 지원 및 다양한 화면 크기에 유연하게 대응할 수 있다.
  • 코드의 복잡성을 줄이고, 리소스를 관리하기 쉽게 만든다.

화면 회전에 대응하기

리소스 조건을 이용해 화면 회전에 대응하는 UI를 만들 수 있다.
스마트폰은 어떤 화면이 세로 방향일 때는 어울리는데 가로 방향으로 회전하면 부적절해서 가로 방향에 알맞은 화면을 따로 제공해야 할 수 있다.

이처럼 화면 회전에 대응하려면 가로와 세로 방향일 때 출력할 레이아웃 XML 파일을 각각 준비해야 한다.

이 코드는 안드로이드 앱에서 화면 회전에 따라 다르게 표시되는 레이아웃을 설정하는 방법을 보여준다. 세로 화면가로 화면에서 각각 다른 레이아웃을 사용하는 방법에 대해 설명한다.

1. 세로 화면 레이아웃 (portrait mode)

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/dbr" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:src="@drawable/ct2" />
</LinearLayout>

설명

1. layout_width="wrap_content"

설명: wrap_content는 뷰의 너비를 콘텐츠의 크기에 맞게 조정한다. 예를 들어, ImageView의 경우, 이미지의 실제 크기에 따라 너비가 설정된다.

용도: 뷰가 자신의 콘텐츠에 맞는 크기로 표시되게 하려는 경우에 사용한다. 예를 들어, 이미지를 정확한 크기로 표시하거나 텍스트의 길이에 맞게 너비를 조정할 때 사용한다.

2. layout_height="0dp"

설명: 0dp는 기본적으로 뷰의 높이를 layout_weight에 따라 계산하게 한다. 0dp는 가중치 기반 레이아웃에서 뷰의 실제 높이를 무시하고, 가중치 값에 따라 높이를 설정한다.

용도: 뷰의 높이를 다른 뷰와의 비율에 따라 조정하고 싶을 때 사용한다. 예를 들어, 여러 ImageView가 같은 공간을 균등하게 나누도록 하고 싶을 때 사용된다.

3. layout_weight="1"

설명: layout_weight는 LinearLayout의 남은 공간을 자식 뷰들 간에 비율적으로 나누는 역할을 한다. 값이 클수록 더 많은 공간을 차지하게 된다. 예를 들어, 두 뷰가 layout_weight="1"로 설정되어 있으면, 두 뷰가 남은 공간을 동일하게 나누게 된다.

용도: 화면 공간을 여러 뷰 간에 균등하게 나누고 싶을 때 사용된다. 가중치를 사용하면 유동적으로 공간을 배분할 수 있다.
이 레이아웃은 세로 화면에서 두 개의 이미지가 화면 전체를 채우도록 배치한다.
(1+1=2이고, 1/2를 차지)

2. 가로 화면 레이아웃 (landscape mode)

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/dbr" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/ct2" />
</LinearLayout>

설명

  • Layout Folder: 이 파일은 res/layout-land/ 폴더에 위치해야 한다. layout-land 폴더는 가로 방향 화면에서 사용할 레이아웃을 정의한다.

  • LinearLayout: LinearLayoutorientation 속성이 horizontal로 설정되어 있어, 자식 뷰들이 수평으로 배치된다.

  • ImageView: 두 개의 ImageView가 포함되어 있으며, 각각 layout_width0dp, layout_heightwrap_content로 설정되어 있다. layout_weight="1"을 통해 두 이미지가 동일한 비율로 화면을 차지한다.

    • layout_width="0dp": 너비는 가중치에 의해 결정된다.
    • layout_height="wrap_content": 높이는 콘텐츠에 맞게 조정된다.
    • layout_weight="1": 남은 공간을 동일하게 나눈다.

이 레이아웃은 가로 화면에서 두 개의 이미지가 화면 전체를 차지하도록 배치한다.

결론

  • 세로 화면(res/layout/): 이미지가 수직으로 배치되며, 각각의 높이는 가중치에 따라 설정된다.
  • 가로 화면(res/layout-land/): 이미지가 수평으로 배치되며, 각각의 너비는 가중치에 따라 설정된다.

3. 폰 크기의 호환성

안드로이드 앱을 개발할 때, 다양한 크기와 해상도의 디바이스에서 일관된 사용자 경험을 제공하기 위해 논리적인 단위를 사용하는 것이 중요하다. 이러한 단위들은 디바이스의 물리적인 픽셀 밀도와 상관없이 화면 요소의 크기와 위치를 일관되게 유지하는 데 도움을 준다.

논리적인 단위 알아보기

1. 안드로이드 기기의 크기

안드로이드 기기들은 다양한 화면 크기와 해상도를 가지고 있다.
기기의 화면 크기는 일반적으로 인치 단위로 측정되며, 해상도는 화면의 픽셀 수를 나타낸다.
예를 들어, 스마트폰, 태블릿, 그리고 대형 화면을 가진 디바이스들은 모두 서로 다른 화면 크기와 해상도를 가진다.

화면 크기와 해상도:

  • 화면 크기: 화면의 물리적인 크기 (인치 단위)다.
  • 해상도: 화면의 픽셀 수 (가로 × 세로)다. 예를 들어, 1080x1920 픽셀.

픽셀 밀도 (DPI):

  • 저해상도 (ldpi): 120 dpi
  • 중해상도 (mdpi): 160 dpi
  • 고해상도 (hdpi): 240 dpi
  • 초고해상도 (xhdpi): 320 dpi
  • 초초고해상도 (xxhdpi): 480 dpi
  • 초초초고해상도 (xxxhdpi): 640 dpi

픽셀 밀도는 화면의 픽셀 밀도를 나타내며, 같은 크기의 물리적 화면에서 더 높은 DPI는 더 많은 픽셀을 의미한다.

2. 앱 개발 시 크기 지정에 사용할 수 있는 단위

가장 일반적으로 사용되는 단위:

  • dp (Density-independent Pixels):

    • 설명: 화면 밀도에 독립적인 픽셀을 의미한다. 다양한 안드로이드 기기들은 서로 다른 화면 크기와 해상도를 가지고 있다. 일반 픽셀 단위를 사용하면 기기마다 UI 요소의 크기가 달라질 수 있기 때문에 dp를 자주 사용한다.
    • 용도: 1dp는 160dpi(dots per inch) 화면에서 1픽셀과 같다. 안드로이드 시스템은 기기의 실제 dpi를 기반으로 dp를 실제 픽셀로 변환한다.
    • 예시:
      160dpi 화면: 1dp = 1px
      320dpi 화면: 1dp = 2px
      480dpi 화면: 1dp = 3px
  • sp (Scale-independent Pixels):

    • 설명: 스케일 독립적인 픽셀로, 사용자 설정의 글꼴 크기와 연동된다. 사용자가 글꼴 크기를 조정하면 sp 단위로 설정된 텍스트 크기도 조정된다.
    • 용도: 주로 텍스트의 크기를 정의하는 데 사용된다.
    • 예시: android:textSize="16sp"는 사용자의 글꼴 크기 설정을 고려하여 크기가 조정된다.
  • pt (Points):

    • 설명: 물리적인 인치 단위로, 1인치는 72 포인트다. 일반적으로 안드로이드에서는 잘 사용되지 않는다.
    • 용도: 물리적인 화면 크기와 관련된 경우에 사용된다.
    • 예시: android:layout_width="10pt"는 매우 특정한 물리적 크기를 설정한다.
  • in (Inches):

    • 설명: 물리적인 인치 단위다.
    • 용도: 매우 드물게 사용되며, 특정 상황에서 물리적 크기를 지정할 때 사용된다.
    • 예시: android:layout_width="2in"는 2인치 너비를 설정한다.
  • mm (Millimeters):

    • 설명: 물리적인 밀리미터 단위다. 잘 사용되지 않는다.
    • 용도: 화면 요소의 물리적 크기를 밀리미터 단위로 정의할 때 사용된다.
    • 예시: android:layout_width="50mm"는 50밀리미터 너비를 설정한다.
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글