Jetpack Compose의 Animated Visibility에 대한 심층 분석

개시하다

  • AnimatedVisibility는 View의 Visibility 변화 애니메이션
  • 이다.
  • AnimatedVisibility는 단일 View에 대해 특별한 움직임이 있는 디스플레이/숨기기를 원할 때 사용
  • AnimatedVisibility에서 매개 변수에 주어진 Editable 또는 MutableTransitionState를 바꾸어 애니메이션을 조작
  • demo.gif

    Editable(Boolean)에서 애니메이션 실행하기

  • remember로 Editable(Boolean) 정의 및 변경
  • Editable(Boolean)이 바뀔 때 애니메이션의 동작
  • Jul-23-2021 14-42-32.gif
    @ExperimentalAnimationApi
    @Composable
    fun AnimatedVisibilitySample() {
        var editable by remember { mutableStateOf(true) }
    
        Column(modifier = Modifier.padding(8.dp)) {
            Text(
                text = "AnimatedVisibility",
                style = MaterialTheme.typography.h6
            )
    
            AnimatedVisibility(visible = editable) {
                Surface(
                    color = Color.Yellow,
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(100.dp)
                        .align(Alignment.CenterHorizontally)
                        .padding(8.dp)
                ) {}
            }
    
            Button(
                onClick = { editable = !editable },
                modifier = Modifier.fillMaxWidth()
            ) {
                Text(text = "Toggle")
            }
        }
    }
    

    MutableTransitionState에서 애니메이션 실행

  • Remember를 사용하여 MutableTransitionState를 정의합니다.
  • MutableTransitionState를 변경할 때 애니메이션이 작동
  • MutableTransitionState에는 현재 디스플레이 상태를 나타내는currentState와 현재 애니메이션 상황을 나타내는 isIdle
  • 이 포함됩니다.
  • 따라서currentState와 isIdle을 조합하면 표시, 표시, 숨기기, 숨기기 등 상태를 식별할 수 있다
  • Jul-23-2021 14-42-37.gif
    @ExperimentalAnimationApi
    @Composable
    fun AnimatedVisibilityStateSample() {
        val state = remember {
            MutableTransitionState(false).apply {
                targetState = true
            }
        }
    
        Column(modifier = Modifier.padding(8.dp)) {
            Text(
                text = "AnimatedVisibilityState",
                style = MaterialTheme.typography.h6
            )
    
            AnimatedVisibility(visibleState = state) {
                Surface(
                    color = Color.Yellow,
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(100.dp)
                        .align(Alignment.CenterHorizontally)
                        .padding(8.dp)
                ) {
                    Text(
                        text = state.getAnimationState().toString()
                    )
                }
            }
    
            Button(
                onClick = { state.targetState = !state.currentState },
                modifier = Modifier.fillMaxWidth()
            ) {
                Text(text = "Toggle")
            }
        }
    }
    
    // 今回はこのような拡張関数を用意してみた、すると簡単にアニメーション状態が取得できる
    enum class AnimState {
        VISIBLE,
        INVISIBLE,
        APPEARING,
        DISAPPEARING
    }
    
    fun MutableTransitionState<Boolean>.getAnimationState(): AnimState {
        return when {
            this.isIdle && this.currentState -> AnimState.VISIBLE
            !this.isIdle && this.currentState -> AnimState.DISAPPEARING
            this.isIdle && !this.currentState -> AnimState.INVISIBLE
            else -> AnimState.APPEARING
        }
    }
    

    표시/숨기기 애니메이션 추가 가능

  • AnimatedVisibility에는 enter 및 exit 매개변수가 있음
  • fadeIn이나fadeOut의 애니메이션을 여기에 건네주면Visibility가 변할 때 간단하게 애니메이션을 추가할 수 있다
  • Jul-23-2021 14-42-41.gif
    @ExperimentalAnimationApi
    @Composable
    fun AnimatedVisibilityEnterExitSample() {
        val state = remember {
            MutableTransitionState(false).apply {
                targetState = true
            }
        }
    
        Column(modifier = Modifier.padding(8.dp)) {
            Text(
                text = "AnimatedVisibilityState",
                style = MaterialTheme.typography.h6
            )
    
            AnimatedVisibility(
                visibleState = state,
                enter = fadeIn(),
                exit = fadeOut()
            ) {
                Surface(
                    color = Color.Yellow,
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(100.dp)
                        .align(Alignment.CenterHorizontally)
                        .padding(8.dp)
                ) {
                    Text(text = state.getAnimationState().toString())
                }
            }
    
            Button(
                onClick = { state.targetState = !state.currentState },
                modifier = Modifier.fillMaxWidth()
            ) {
                Text(text = "Toggle")
            }
        }
    }
    

    끝말

  • Animation Visibility에서 View의 Visibility
  • 를 애니메이션으로 간단하게 전환할 수 있음
  • Animation Visibility는 움직임이 있는 디스플레이/숨기기를 잘 한다
  • 참고 문헌

  • https://developer.android.com/jetpack/compose/animation#animatedvisibility
  • 좋은 웹페이지 즐겨찾기