[Android / Compose] Expandable 메뉴 레이아웃 구현

2024. 12. 18. 21:55· Development/Android
목차
  1. 기본 작동 방식
  2. 주요 옵션 및 속성
반응형
Expandable menu

위처럼 클릭할 때마다 열렸다 닫혔다를 반복하는 메뉴 레이아웃 구성 방법입니다.

Compose의 AnimatedVisibility를 활용하여 간단하게 Expand 효과를 적용할 수 있습니다.

기본 작동 방식

  • visible: Boolean 값을 통해 콘텐츠의 표시 여부를 결정합니다.
  • 애니메이션 효과: 요소가 보이거나 사라질 때 애니메이션 효과를 자동으로 적용합니다.
@Composable
fun ColumnScope.AnimatedVisibility(
    visible: Boolean,
    modifier: Modifier = Modifier,
    enter: EnterTransition = fadeIn() + expandVertically(),
    exit: ExitTransition = fadeOut() + shrinkVertically(),
    label: String = "AnimatedVisibility",
    content: @Composable AnimatedVisibilityScope.() -> Unit
) {
    val transition = updateTransition(visible, label)
    AnimatedVisibilityImpl(transition, { it }, modifier, enter, exit, content = content)
}

주요 옵션 및 속성

  1. visible:
    • Boolean 값으로 콘텐츠의 표시 여부를 설정.
    • true: 요소가 애니메이션과 함께 나타남.
    • false: 요소가 애니메이션과 함께 사라짐.
  2. enter:
    • 요소가 나타날 때 적용할 애니메이션을 설정.
    • 기본값은 fadeIn()
  3. exit:
  • 요소가 사라질 때 적용할 애니메이션을 설정.
  • 기본값은 fadeOut()

content 안에는 열렸을 때 보여줄 내용들을 구성해 주면 됩니다.

@Composable
fun SettingsItem(title: String, onClick: () -> Unit) {
    var expand by remember { mutableStateOf(false) }

    Column(
        modifier = Modifier
            .fillMaxWidth()
            .clickable(onClick = { expand = !expand })
            .padding(horizontal = 16.dp, vertical = 12.dp)
    ) {
        Row(
            modifier = Modifier
                .fillMaxWidth()
                .height(48.dp),
            verticalAlignment = Alignment.CenterVertically,
            horizontalArrangement = Arrangement.SpaceBetween
        ) {
            Text(
                text = title,
                color = Color.Black,
                fontSize = 18.sp
            )

            Icon(
                imageVector = Icons.Default.ArrowForward,
                contentDescription = "Go to $title",
                tint = Color.Gray
            )
        }
        AnimatedVisibility(visible = expand) {
            Column(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(vertical = 8.dp)
            ) {
                Button(
                    onClick = { onClick() },
                    colors = ButtonDefaults.buttonColors(containerColor = Color.Red),
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(48.dp)
                ) {
                    Text(
                        text = "Delete",
                        color = Color.White,
                        fontSize = 16.sp
                    )
                }
            }
        }
        Spacer(modifier = Modifier.height(8.dp))
        Divider(color = Color.LightGray, thickness = 1.dp)
    }
}

expand state 변수를 통해 메뉴가 열릴 지 닫힐지가 갱신됩니다.

반응형
저작자표시 (새창열림)
  1. 기본 작동 방식
  2. 주요 옵션 및 속성
'Development/Android' 카테고리의 다른 글
  • [Android / Kotlin] 갤러리 앱 보기 상태로 접근하기
  • [Android / Kotlin] View Background Stroke 색상 변경하기
  • [Android] Intent로 Activity 전환 시, 애니메이션 적용
  • [Android] Proguard와 DEX 파일 연관성
SeungYong.Lee
SeungYong.Lee
Win-DevSeungYong.Lee 님의 블로그입니다.
반응형
SeungYong.Lee
Win-Dev
SeungYong.Lee
전체
오늘
어제
  • All (236) N
    • Development (136) N
      • Android (132) N
      • iOS (0)
      • Flutter (4)
      • Backend (0)
    • Algorithm (5)
    • Knowledge (5)
      • IT (2)
      • Science (0)
      • ETC & Tip (3)
    • Today I Learn (28)
    • Coding Test (62)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 안녕하세요. 반갑습니다 :)

인기 글

태그

  • 비동기처리
  • Widget
  • 프로그래머스
  • Flutter
  • hilt
  • glance
  • compose
  • 코딩테스트
  • exception
  • Collection
  • HTTP
  • Retrofit
  • Android
  • coroutine
  • Kotlin
  • dfs
  • Java
  • Animation
  • 코틀린
  • Imageview

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
SeungYong.Lee
[Android / Compose] Expandable 메뉴 레이아웃 구현
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.