Android는 일반적인 이미지(jpg, png, gif)들 말고도 사용할 수 있는 이미지(drawable)의 형식이 많이있다. 그 중 프로젝트 진행시에 개인적으로 많이 사용하는 형식들을 정리해보고자 한다.

* Layer List.

LayerDrawable은 다수의 drawable들을 하나의 drawable로 정의한 뒤 사용할 수 있는 drawable이다. <layer-list>에 각각의 drawable들은 <item>으로 정의되고, 가장 먼저 정의된 <item>을 가장 먼저 화면에 그린 뒤, 그 다음에 나오는 <item>들을 순차적으로 그리기(overdraw) 때문에 겹치는 공간에 그려질 경우 가장 마지막에 정의된 <item>이 화면에 보여지게 된다.

개인적으로는 Gradient가 들어간 header나 button들을 그리기위해서 자주 사용한다.

위의 <layer-list>에서 첫번째와 두번째 <item>은 위/아래 경계선을 그리는데 사용되고, 세번째 <item>은 gradient 효과를 갖는 body를 그리기 위해 사용한다.

<layer-list>를 잘 정의해서 사용할 경우 이미지 교체없이 RGB값 변경만으로 UI를 변경할 수 있다는 장점과 다양한 해상도에 대응이 용이하다는 장점, 2가지 장점를 동시에 갖는다.

 

* State List.

View(Button, ToggleButton, …)의 상태(pressed, focused, checked or neither)에 따라 다른 이미지(drawable)를 보여줄 때 사용. <selector>의 자식으로 정의하려는 각각의 상태 <item>으로 정의한다. View의 상태가 변경될 때, state list는 위에서 아래로 현재 상태에 맞는 <item>을 찾기 시작하고 현재 상태에 맞는 <item>을 찾아서 적용한다.

중요한 점은 <selector>에 정의된 <item>들을 위에서 아래로 찾기 시작한다는 점과 ‘best match’ algorithm이 아닌 현재 View의 상태를 일부분이라도 만족시키는 첫번째 <item>을 선택한다는 점이다.

따라서 복잡한 룰을 갖는 <item>을 위default로 사용하려는 <item>을 마지막에 정의하는 것이 일반적이다.

 

* Level List.

state-list와 비슷하지만 다른점은 View의 state에 따른 drawable 이미지를 정의하는 것이 아니라, drawable의 level 값에 따라 그려질 이미지들을 정의하는 것이다. drawable의 level은 Drawable의 setLevel() 함수나 ImageView의 setImageLevel()를 통해 설정할 수 있다. 개인적으로는 자주 사용하지는 않지만 게임을 만들게 된다면 유용할 것 같다.

 

* Inset Drawable.

이미지에 여백을 추가할 때 사용. top, bottom, left, right 각각의 여백(View에 padding을 준것과 비슷하다)을 정의할 수 있다.

 

* Clip Drawable.

이미지의 일정부분만을 보여주고 싶을 때 사용. 얼마만큼을 보여줄지는 drawable의 level값으로 조절할 수 있다. level은 0 ~ 10,000까지 적용가능하고 0은 전부 clip된 상태 즉 invisible한 상태를 뜻하고 10,000은 전부 보여지는 상태를 뜻한다.

clipOrientaion과 gravity 속성을 통해 clip되는 방향과 위치를 설정할 수 있다. 옵션값들에 대한 설명은 http://developer.android.com/guide/topics/resources/drawable-resource.html#Clip에 자세히 나와있다.

 

* Bitmap Tile Mode.

이미지의 원래 크기보다 그려질 영역이 클 때 어떻게 그릴 것인가를 정의.

1) disabled : 타일 모드를 적용하지 않는다.

2) clamp : 이미지의 경계선을 반복해서 사용한다.

3) repeat : 전체 이미지를 가로/세로 반복해서 사용한다. (이미지를 미리 패턴화해야 어색하지 않게 사용할 수 있다.)

4) mirror : repeat과 비슷한데 거울에 비춘 것처럼 반복해서 사용한다.

 

* Animation List(Frame Animation).

여러개의 이미지를 통해 Animation을 만들 때 사용.