오늘은 슬라이더를 움직여 RGB 값을 조정하면 실시간으로 색상이 변경되는
RGB 색상 조합기를 만들어보겠습니다.
1) RGBColorPickerDemo
@Composable
fun RGBColorPickerDemo() {
var red by remember { mutableStateOf(0f) }
var green by remember { mutableStateOf(0f) }
var blue by remember { mutableStateOf(0f) }
val animatedColor by animateColorAsState(
targetValue = Color(red / 255, green / 255, blue / 255)
)
각 red, green, blue는 컴퓨터 그래픽이나 디지털 디지털 디스플레이에서 색상을 구성하는 기본 요소인 RGB 삼원색 (Primary Colors) 을 의미합니다. 이 세 가지 색상을 다양한 비율로 조합하여 수 백만 가지 색상을 표현할 수 있습니다.
오늘은 위 세 가지 색상을 직접 다양한 비율로 조합해볼 수 있는 색상 조합기를 만들어볼 예정입니다.
- RGB 모델의 특징
- 가산 혼합 (Additive Color Mixing)
- RGB 삼원색을 더하면 더 밝아지고, 모두 합치면 흰색이 됩니다.
- 예:
- 빨강 + 초록 = 노랑
- 초록 + 파랑 = 청록
- 파랑 + 빨강 = 자홍 (보라)
- 조명이나 화면과 같은 빛 기반 디스플레이에서 사용됩니다.
- 값 범위
- 일반적으로 0~255의 범위를 사용합니다.
- 0은 해당 색상이 없는 상태(검정), 255는 최대 강도(완전한 색, 흰색) 입니다.
2) 화면 구성
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "RGB Color Picker",
fontSize = 24.sp,
modifier = Modifier.padding(bottom = 16.dp)
)
Column 레이아웃은 위에서 아래로 요소를 나열하는 레이아웃 입니다.
fillMaxSize() 를 사용해, 화면 전체를 채우도록 설정해줍니다. 또한 padding 값을 설정해 화면 테두리에 여백을 추가합니다.
3) 색상 박스
Box(
modifier = Modifier
.size(150.dp)
.padding(16.dp)
.background(animatedColor)
)
Box 는 사각형 컨테이너를 생성하는 요소입니다.
너비와 높이, 배경색상을 설정해줍니다.
4) RGBSlider 함수
@Composable
fun RGBSlider(label: String, value: Float, onValueChange: (Float) -> Unit) {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start
) {
Text(text = label, fontSize = 18.sp)
Slider(
value = value,
onValueChange = { onValueChange(it) },
valueRange = 0f..255f,
modifier = Modifier.padding(vertical = 8.dp)
)
}
}
RGBSlider 함수는 슬라이더 UI를 생성합니다.
슬라이더를 움직이면 각각의 red, green, blue 값이 변경됩니다.
5) HEX 코드로 변환
(red.toInt() shl 16) or (green.toInt() shl 8) or blue.toInt()
헥스 코드(HEX Code)**는 **16진수(Hexadecimal)**를 사용해 색상을 표현하는 방법입니다.
웹 개발이나 디자인에서 색상을 정의할때 사용되며 RGB 값을 기반으로 만들어집니다.
예: RGB 값 (255, 0, 0) → HEX 값 #FF0000 (빨강)
아래는 전체 코드입니다
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
RGBColorPickerDemo()
}
}
}
@Composable
fun RGBColorPickerDemo() {
var red by remember { mutableStateOf(0f) }
var green by remember { mutableStateOf(0f) }
var blue by remember { mutableStateOf(0f) }
val animatedColor by animateColorAsState(
targetValue = Color(red / 255, green / 255, blue / 255)
)
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "RGB Color Picker",
fontSize = 24.sp,
modifier = Modifier.padding(bottom = 16.dp)
)
Box(
modifier = Modifier
.size(150.dp)
.padding(16.dp)
.background(animatedColor)
)
Spacer(modifier = Modifier.height(16.dp))
RGBSlider("Red", red) { red = it }
RGBSlider("Green", green) { green = it }
RGBSlider("Blue", blue) { blue = it }
Text(
text = "Current Color: #${
Integer.toHexString((red.toInt() shl 16) or (green.toInt() shl 8) or blue.toInt())
.uppercase()
}",
textAlign = TextAlign.Center,
fontSize = 16.sp
)
}
}
@Composable
fun RGBSlider(label: String, value: Float, onValueChange: (Float) -> Unit) {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start
) {
Text(text = label, fontSize = 18.sp)
Slider(
value = value,
onValueChange = { onValueChange(it) },
valueRange = 0f..255f,
modifier = Modifier.padding(vertical = 8.dp)
)
}
}
시연 영상입니다
'안드로이드 코틀린' 카테고리의 다른 글
[Kotlin][Android] Jetpack Compose로 검색 필터 기능 만들기 (4) | 2024.12.21 |
---|---|
[Kotlin][Android] Jetpack Compose로 아이템 Drag & Drop 구현하기 (0) | 2024.12.15 |
[Kotlin][Android] Jetpack Compose를 이용한 부드러운 막대 그래프 애니메이션 구현하기 (0) | 2024.12.03 |
[Kotlin][Android] Jetpack Compose 텍스트 작성 중인 상태에 대해 사용자에게 알리기 (0) | 2024.11.27 |
[Kotlin][Android] 문자열 형식 체크하기 (0) | 2024.11.23 |