본문 바로가기
카테고리 없음

Android Compose 버튼: 상태별 아이콘 변경 가이드

by h4r3 2025. 2. 3.
반응형

 

Android Compose에서 버튼의 enabled, pressed, disabled 상태에 따라 다채로운 아이콘을 표시하는 방법을 상세히 안내합니다. interactionSource, ButtonDefaults.buttonColors 등 다양한 기술을 활용하여 사용자 경험을 향상시키는 방법을 소개합니다.

 


 

Android Compose를 사용하여 앱을 개발할 때, 버튼은 사용자와 상호 작용하는 핵심 요소입니다. 버튼의 상태(활성화, 클릭, 비활성화)에 따라 다른 아이콘을 표시하는 것은 사용자 경험(UX)을 향상시키는 효과적인 방법입니다. 본 가이드에서는 Android Compose에서 버튼 상태별 아이콘을 변경하는 다양한 방법을 소개하고, 각 방법의 장단점을 비교 분석하여 개발자가 상황에 맞는 최적의 방법을 선택할 수 있도록 돕습니다.

 

1. interactionSource를 활용한 동적 아이콘 변경

interactionSource는 버튼의 상호 작용 상태를 추적하는 데 사용되는 강력한 도구입니다. MutableInteractionSource를 사용하여 버튼의 클릭, 터치 등의 이벤트를 감지하고, Interaction.collectAsState()를 통해 현재 상호 작용 상태를 수집합니다. 수집된 상태에 따라 조건부 로직을 적용하여 각 상태에 맞는 아이콘을 표시할 수 있습니다.

반응형
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.Interaction
import androidx.compose.material.Button
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.graphics.vector.rememberVectorPainter

@Composable
fun MyButton() {
    val interactionSource = remember { MutableInteractionSource() }
    val interactionState by interactionSource.interactions.collectAsState()

    Button(
        onClick = { /* 버튼 클릭 동작 */ },
        interactionSource = interactionSource
    ) {
        when (interactionState) {
            is Interaction.Pressed -> {
                Icon(
                    painter = rememberVectorPainter(image = /* pressed 아이콘 */),
                    contentDescription = "Pressed Icon"
                )
                Text("Pressed")
            }
            is Interaction.Disabled -> {
                Icon(
                    painter = rememberVectorPainter(image = /* disabled 아이콘 */),
                    contentDescription = "Disabled Icon"
                )
                Text("Disabled")
            }
            else -> {
                Icon(
                    painter = rememberVectorPainter(image = /* enabled 아이콘 */),
                    contentDescription = "Enabled Icon"
                )
                Text("Enabled")
            }
        }
    }
}

 

2. ButtonDefaults.buttonColors를 활용한 간편한 아이콘 색상 변경

ButtonDefaults.buttonColors를 사용하면 버튼의 상태별 색상을 간편하게 설정할 수 있습니다. contentColor 파라미터에 ColorStateList를 전달하여 각 상태에 따른 아이콘 색상을 지정할 수 있습니다. 이 방법을 사용하면 아이콘 이미지를 직접 변경하는 대신 색상만 변경하여 시각적인 효과를 줄 수 있습니다.

 
import androidx.compose.foundation.layout.size
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.unit.dp

@Composable
fun MyButton() {
    Button(
        onClick = { /* 버튼 클릭 동작 */ },
        colors = ButtonDefaults.buttonColors(
            contentColor = androidx.compose.ui.graphics.ColorStateList.of(
                intArrayOf(android.R.attr.state_enabled),
                intArrayOf(-android.R.attr.state_enabled),
                intArrayOf(android.R.attr.state_pressed)
            ),
            contentColor = listOf(
                Color.White, // enabled 상태 아이콘 색상
                Color.Gray, // disabled 상태 아이콘 색상
                Color.LightGray // pressed 상태 아이콘 색상
            )
        )
    ) {
        Icon(
            painter = rememberVectorPainter(image = /* 아이콘 */),
            contentDescription = "Button Icon",
            modifier = Modifier.size(24.dp)
        )
        Text("My Button")
    }
}

 

3. 다양한 방법의 장단점 비교 분석

 

방법 장점 단점
interactionSource - 동적 아이콘 변경 가능 - 코드 복잡성 증가
ButtonDefaults.buttonColors - 간편한 색상 변경 - 아이콘 이미지 변경 불가

 

 

결론

Android Compose에서 버튼 상태별 아이콘을 변경하는 다양한 방법을 살펴보았습니다. interactionSource를 사용하면 동적으로 아이콘을 변경할 수 있지만, 코드 복잡성이 증가할 수 있습니다. ButtonDefaults.buttonColors를 사용하면 간편하게 아이콘 색상을 변경할 수 있지만, 이미지 자체를 변경할 수는 없습니다. 따라서 개발자는 프로젝트의 요구 사항과 상황에 맞춰 최적의 방법을 선택해야 합니다.

 

추가 정보:

 

Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Button 버튼은 사용자가 정의된 작업을 트리거할 수 있

developer.android.com

 

 

Kotlin: A Concise Multiplatform Language Developed by JetBrains

 

www.jetbrains.com

 

반응형