Compose의 Color객체
기존 안드로이드에서는 Color을 기본적으로 resource폴더의 color.xml상에 정의해놓고 사용했다. 물론 Color가 직접 객체로 설정되는 경우도 있었지만 거의 사용되지 않았다. Compose에서는 더이상 Color을 xml에 정의하지 않는다. Compose에서는 Color을 Color객체로 생성해놓고 사용한다. 자 아래에서 Compose에서 Color을 어떻게 표현하는지 살펴보자.
16진수로 표현하는 Android Compose의 Color 시스템
@Stable
fun Color(color: Long): Color {
return Color(value = (color.toULong() and 0xffffffffUL) shl 32)
}
Compose의 Color 시스템은 16진수 8자리(4byte)로 표현된다. Color의 인자인 Long 값으로 16진수 8자리를 넘기면 Color 객체가 만들어진다.
Compose 내부에 미리 정의된 Black을 이용해 16진수 8자리가 어떤 것을 뜻하는지 알아보자.
companion object {
val Black = Color(0xFF000000)
..
}
Black은 0xFF000000으로 표현된다. Black의 0x(16 진수를 표현) 뒤에 오는 8자리 값은 2자리씩 순서대로 불투명도, R(Red), G(Green), B(Blue) 값을 나타낸다. 아래 그림1을 통해 직관적으로 살펴보자.
Black의 0x뒤에 나오는 FF는 불투명도가 1이라는 것을 뜻하고 Red값이 0 Green값이 0 Blue 값이 0임을 나타낸다.
Int로 표현하는 Color
위에서는 Color을 Hex(16진수) 8자리 값으로 표현했다. 이를 Int값으로 표현하는 것 또한 가능하다.
@Stable
fun Color(/*@ColorInt*/ color: Int): Color {
return Color(value = color.toULong() shl 32)
}
16진수 8자리에 해당하는 값을 10진수로 변환해서 Int 값에다 넣으면 그대로 16진수로 변환하는 과정을 거친다. 한 번 Black의 16진수값인 0xFF000000을 10진수로 변환해보자
0xFF000000 = 4278190080
자 이제 4278190080을 넣어 새로운 Color 객체를 만들어 보자.
똑같이 나오는 것을 확인할 수 있다.
하지만, 이 방식은 불가피할 경우에만 사용하도록 하자. 16진수가 항상 기본이다. 서버의 기본 Color 시스템이 10진수가 아닌이상 10진수로 Color객체를 만드는 것은 지양해야 한다.
정리
- Compose에서는 Color을 객체로 저장해놓고 사용한다.
- Android는 16진수 8자리를 이용해 Color을 표현하는 방식을 쓴다. 이는 즉 4byte(256*256*256*256)가 Color 하나를 표하는데 드는 것을 뜻한다.
- Android는 10진수를 16진수로 자동 변환하는 메서드 또한 제공한다. 하지만 이 방식을 사용하는 것은 코드 일관성을 위해 지양해야 한다.