[Android] resource

유민국·2023년 7월 13일
0

resource

애플리케이션에서 사용하는 다양한 미디어 파일, 데이터 파일 등을 리소스 파일이라고 부른다.
안드로이드는 리소스 파일들을 res 폴더를 통해 관리한다.
안드로이드는 이미지와 xml 파일을 리소스로 관리하며 xml 파일을 안드로이드에서 정의한 데이터들을 관리하는 용도로 사용한다.
xml 파일로 관리되는 데이터들은 언어, 크기 등에 따라 단말기에 대응할 수 있도록 처리할 수도 있다.

문자열 관리

문자열, 문자열 배열을 xml에 등록해서 사용할 수 있다.
다국어 지원을 위해 사용한다.

res 에서 적용하기

// 둘 다 가능
var str1 = getString(R.string.str1)
textView.setText(R.string.str1)

문자열 포멧팅

<!-- 문자열 : %s, 정수 : %d, 실수 : %f, 그 외 : %s -->
<string name="str3">이름은 %s이고, 나이는 %d살 입니다</string>
val str1 = getString(R.string.str3)
// % 부분에 값을 설정하여 문자열을 완성한다.
val str2 = String.format(str1, "홍길동", 30)

문자열 배열

<!-- 문자열 배열 -->
<string-array name="str4_array">
    <item>항목1</item>
    <item>항목2</item>
    <item>항목3</item>
    <item>항목4</item>
    <item>항목5</item>
</string-array>
val str4Array = resources.getStringArray(R.array.str4_array)
textView.text = ""

for(str1 in str4Array){
    textView.append("{$str1}\n")
}

색상 관리

색상을 xml에 등록해서 사용할 수 있다.
안드로이드는 단말기 제조사가 자신의 단말기에 안드로이드 OS를 넣게 된다.
이 때, 단말기마다 지원하는 색상, 처리 방식 등이 달라 원하는 색상이 나오지 않을 수도 있는데 이 처리를 안드로이드 OS가 해줄 수 있게 된다.

// RGB지정 (R - RED, G - Green, B - Blue, 빛의 삼원색)
val c1 = Color.rgb(227, 30, 89)
textView.setTextColor(c1)
// ARGB 지정(A - alpha, R - Red, G - Green, B - Blue, 투명색과 빛의 삼원색)
val c2 = Color.argb(50, 227, 30, 89)
textView.setTextColor(c2)
// context가 제공하는 메서드를 통해 색상값을 가져온다.
val c3 = getColor(R.color.color1)
textView.setTextColor(c3)

크기 관리

크기를 xml에 등록해서 사용할 수 있다.
모든 디스플레이 장비는 px 이라는 단위로 크기 등을 결정하게 된다.
안드로이드는 다양한 단말기 때문에 px을 사용하면 크기가 다르게 나타날 수 있다.
안드로이드는 가변형 단위들을 제공한다.

단위

  • android에서는 dp 단위를 쓰고 문자는 sp를 사용한다.
    --> sp를 사용하는 이유는 디바이스 설정에 따라 글자 크기를 조절해야되기 때문
    160ppi : 1 inch^2 안에 160x160 픽셀이 들어있다
    px : 실제 사용할 픽셀의 개수
    dp : 160ppi 액정에서 1dp = 1px
    -> 320ppi 일 경우 1dp = 2px이 된다.
    sp : 단말기에 설정되어 있는 글자 크기에 따라 가변 기본 크기에서 160ppi 액정에서 1sp = 1px
    mm : 밀리미터
    in : 인치
    pt : 1pt = 1/72인치

이미지 리소스

안드로이드는 drawable 폴더에 이미지를 넣어서 이미지를 사용할 수 있다.
이 때 xml 통해 이미지를 새롭게 구성하여 사용할 수 있다.
여러 이미지를 겹쳐 하나의 이미지를 만들 때
패턴 이미지를 만들 때
상태에 따른 이미지를 만들 때
기타 등등
아이콘

drawable vs mipmap

현재 안드로이드는 이미지를 넣는 폴더로 drawable과 mipmap을 제공한다.
mipmap 은 애플리케이션의 아이콘으로 사용할 이미지를 넣는 곳이고 drawable은 애플리케이션 내에서 사용할 이미지를 넣은 곳이다.
두 폴더의 차이는 뒤에서 살펴본다.

drawable, Bitmap

두 클래스 모두 이미지 데이터를 관리하는 클래스이다.
Bitmap은 jpg, png, gif 파일로 부터 읽어온 이미지 데이터를 관리하는 객체이다.
Drawable 은 Bitmap을 포함하여 xml 파일을 통해 만든 이미지, 코드를 통해 만든 이미지 등도 포함한다. Drawable은 안드로이드에서 화면이 그릴 수 있는 요소들을 모두 포함한다.

예시

  1. 타일로 백그라운드 채우기
    tile.xml, root element : bitmap
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/p"
    android:tileMode="repeat"/>
  1. 이미지 합치기
    layer.xml, root element : layer-list
<item>
    <bitmap android:src="@drawable/img1" android:gravity="center"/>
</item>
<item android:top="10dp" android:left="10dp" android:gravity="center">
    <bitmap android:src="@drawable/img2"/>
</item>
<item android:top="20dp" android:left="20dp" android:gravity="center">
    <bitmap android:src="@drawable/img3"/>
</item>
  1. 버튼 custom 하기
    btn_image.xml, root element : selecter
<!-- 버튼을 누른 상태 -->
<item android:state_pressed="true" android:drawable="@drawable/btn1"/>
<!-- 그 외의 모든 상태 -->
<item android:drawable="@drawable/btn2"/>
  1. animation 만들기
    ani_data.xml, root element : animation-list
<!-- oneshot : true를 설정해주면 반복되지 않는다. -->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
    <!-- drawable : 보여줄 이미지 -->
    <!-- duration : 현재 이미지를 보여줄 시간 -->
    <item android:drawable="@drawable/ani_img1" android:duration="100"/>
    <item android:drawable="@drawable/ani_img2" android:duration="100"/>
    <item android:drawable="@drawable/ani_img3" android:duration="100"/>
    <item android:drawable="@drawable/ani_img4" android:duration="100"/>
    <item android:drawable="@drawable/ani_img5" android:duration="100"/>
    <item android:drawable="@drawable/ani_img6" android:duration="100"/>
    <item android:drawable="@drawable/ani_img7" android:duration="100"/>
    <item android:drawable="@drawable/ani_img8" android:duration="100"/>
</animation-list>
profile
안녕하세요 😊

0개의 댓글