기본 콘텐츠로 건너뛰기

Android Compose Animation

나타남 / 사라짐 애니메이션

AnimatedVisibility의 enter 및 exit 매개변수를 사용하면 컴포저블이 표시되고 사라질 때의 동작을 구성할 수 있습니다. 자세한 내용은 전체 문서를 참고하세요.

컴포저블의 가시성을 애니메이션화하는 또 다른 방법은 animateFloatAsState를 사용하여 시간에 따라 알파를 애니메이션화하는 것입니다

var visible by remember {
    mutableStateOf(true)
}
val animatedAlpha by animateFloatAsState(
    targetValue = if (visible) 1.0f else 0f,
    label = "alpha"
)
Box(
    modifier = Modifier
        .size(200.dp)
        .graphicsLayer {
            alpha = animatedAlpha
        }
        .clip(RoundedCornerShape(8.dp))
        .background(colorGreen)
        .align(Alignment.TopCenter)
) {
}


하지만 알파를 변경하면 컴포저블이 컴포지션에 남아 레이아웃된 공간을 계속 차지한다는 주의사항이 있습니다. 

이로 인해 스크린 리더와 기타 접근성 메커니즘에서 화면의 항목을 계속 고려할 수 있습니다. 

반면 AnimatedVisibility는 결국 컴포지션에서 항목을 삭제합니다.



AnimatedVisibility의 enter 및 exit 매개변수를 사용하면 컴포저블이 표시되고 사라질 때의 동작을 구성할 수 있습니다. 자세한 내용은 전체 문서를 참고하세요.

컴포저블의 가시성을 애니메이션화하는 또 다른 방법은 animateFloatAsState를 사용하여 시간에 따라 알파를 애니메이션화하는 것입니다


if (animateBackgroundColor) colorGreen else colorBlue,
    label = "color"
)
Column(
    modifier = Modifier.drawBehind {
        drawRect(animatedColor)
    }
) {
    // your composable here
}


var expanded by remember { mutableStateOf(false) }
Box(
    modifier = Modifier
        .background(colorBlue)
        .animateContentSize()
        .height(if (expanded) 400.dp else 200.dp)
        .fillMaxWidth()
        .clickable(
            interactionSource = remember { MutableInteractionSource() },
            indication = null
        ) {
            expanded = !expanded
        }

) {
}



컴포저블의 위치를 애니메이션으로 표시하려면 animateIntOffsetAsState()과 함께 Modifier.offset{ }를 사용합니다.

var moved by remember { mutableStateOf(false) }
val pxToMove = with(LocalDensity.current) {
    100.dp.toPx().roundToInt()
}
val offset by animateIntOffsetAsState(
    targetValue = if (moved) {
        IntOffset(pxToMove, pxToMove)
    } else {
        IntOffset.Zero
    },
    label = "offset"
)

Box(
    modifier = Modifier
        .offset {
            offset
        }
        .background(colorBlue)
        .size(100.dp)
        .clickable(
            interactionSource = remember { MutableInteractionSource() },
            indication = null
        ) {
            moved = !moved
        }
)




컴포저블의 패딩을 애니메이션으로 처리하려면 animateDpAsState를 Modifier.padding()와 함께 사용합니다.

var toggled by remember {
    mutableStateOf(false)
}
val animatedPadding by animateDpAsState(
    if (toggled) {
        0.dp
    } else {
        20.dp
    },
    label = "padding"
)
Box(
    modifier = Modifier
        .aspectRatio(1f)
        .fillMaxSize()
        .padding(animatedPadding)
        .background(Color(0xff53D9A1))
        .clickable(
            interactionSource = remember { MutableInteractionSource() },
            indication = null
        ) {
            toggled = !toggled
        }
)




val infiniteTransition = rememberInfiniteTransition(label = "infinite transition")
val scale by infiniteTransition.animateFloat(
    initialValue = 1f,
    targetValue = 8f,
    animationSpec = infiniteRepeatable(tween(1000), RepeatMode.Reverse),
    label = "scale"
)
Box(modifier = Modifier.fillMaxSize()) {
    Text(
        text = "Hello",
        modifier = Modifier
            .graphicsLayer {
                scaleX = scale
                scaleY = scale
                transformOrigin = TransformOrigin.Center
            }
            .align(Alignment.Center),
        // Text composable does not take TextMotion as a parameter.
        // Provide it via style argument but make sure that we are copying from current theme
        style = LocalTextStyle.current.copy(textMotion = TextMotion.Animated)
    )
}



구글문서참고

 https://developer.android.com/develop/ui/compose/animation/quick-guide?_gl=1*bqkue9*_up*MQ..*_ga*MTQ2NDcwNjM0OS4xNzMxMTk1NDY2*_ga_6HH9YJMN9M*MTczMTE5NTQ2NS4xLjAuMTczMTE5NTQ2NS4wLjAuMTU2MDEwNTc2Mw..&hl=ko

댓글

이 블로그의 인기 게시물

아이랑스토리 어플리케이션 개인정보처리방침

개인정보처리방침 아이랑스토리 어플리케이션은 개인정보보호법에 따라 이용자들의 개인정보 보호 및 권익을 보호하고자 다음과 같은 처리방침을 두고 있습니다. 당사는 개인정보처리방침을 개정하는 경우 앱 화면 및 웹사이트 공지사항을 통하여 공지할 것입니다. 개인정보의 처리 목적 본 어플리케이션은 개인정보를 수집하지 않는 독립 실행형 어플리케이션으로 별도의 서버를 운영하거나 정보를 수집하지 않습니다. 당사에서 개인정보를 별도로 저장하거나 이용하지 않습니다. 당사는 안드로이드 서비스 기능을 이용하기 위한 기능과 광고서비스 등에서 특정 개인과 직접적인 관련이 없는, 개인식별이 불가능한 정보를 수집할 수 있습니다. Google AdMob Kakao Adfit Firebase Analytics Firebase Crashlytics Firebase Messaging 개인정보 파일 현황 당사는 별도의 개인정보 파일을 사용하지 않으며 저장하지도 않습니다. 당사는 쿠키를 저장하지 않으며 이용하지 않습니다. 단, 스토어 서비스가 이용하는 정보 및 광고서비스가 이용하는 정보는 해당 서비스의 SDK를 거쳐 이용하게 됩니다. 이는 당사에 저장되는 정보가 아닙니다. 이용자가 이에 대해 의문이 있다면 해당 서비스(구글 및, 각 광고 미디어)로 직접 연락해야 합니다. 개인정보의 처리 및 보유기간 당사는 개인정보를 직접적으로 저장하거나 보유하지 않습니다. 당사의 어플리케이션은 모두 해당 미디어서비스(애플, 구글 ,광고미디어)의 SDK를 통해 간접적으로 이용합니다. 따라서 당사는 이용자의 개인정보를 처리하는 내용도 보유기간도 없습니다. 개인정보의 제3자 제공에 관한 사항 당사는 개인정보를 제3자에게 제공하지 않고 있습니다. 개인정보처리 위탁 당사는 개인정보를 위탁하고 있지않습니다. 정보주체의 권리, 의무 및 그 행사방법 이용자는 개인정보주체로서 권리 행사할 수 있습니다. 개인정보 열람요구 오류 등이 있을 경우 정정 요구 삭제요구 처리 정지 요구 당사는 개인정보를 저장하거나 위탁하지 않습니다. 개인정보의...

나침반 플래쉬 어플리케이션 개인정보처리방침

  개인정보처리방침 나침반 플래쉬 어플리케이션은 개인정보보호법에 따라 이용자들의 개인정보 보호 및 권익을 보호하고자 다음과 같은 처리방침을 두고 있습니다. 당사는 개인정보처리방침을 개정하는 경우 앱 화면 및 웹사이트 공지사항을 통하여 공지할 것입니다. 개인정보의 처리 목적 본 어플리케이션은 개인정보를 수집하지 않는 독립 실행형 어플리케이션으로 별도의 서버를 운영하거나 정보를 수집하지 않습니다. 당사에서 개인정보를 별도로 저장하거나 이용하지 않습니다. 당사는 안드로이드 서비스 기능을 이용하기 위한 기능과 광고서비스 등에서 특정 개인과 직접적인 관련이 없는, 개인식별이 불가능한 정보를 수집할 수 있습니다. Google AdMob Firebase Analytics Firebase Crashlytic 개인정보 파일 현황 당사는 별도의 개인정보 파일을 사용하지 않으며 저장하지도 않습니다. 당사는 쿠키를 저장하지 않으며 이용하지 않습니다. 단, 스토어 서비스가 이용하는 정보 및 광고서비스가 이용하는 정보는 해당 서비스의 SDK를 거쳐 이용하게 됩니다. 이는 당사에 저장되는 정보가 아닙니다. 이용자가 이에 대해 의문이 있다면 해당 서비스(구글 및 각 광고 미디어)로 직접 연락해야 합니다. 개인정보의 처리 및 보유기간 당사는 개인정보를 직접적으로 저장하거나 보유하지 않습니다. 당사의 어플리케이션은 모두 해당 미디어서비스(구글, 광고미디어)의 SDK를 통해 간접적으로 이용합니다. 따라서 당사는 이용자의 개인정보를 처리하는 내용도 보유기간도 없습니다. 개인정보의 제3자 제공에 관한 사항 당사는 개인정보를 제3자에게 제공하지 않고 있습니다. 개인정보처리 위탁 당사는 개인정보를 위탁하고 있지않습니다. 정보주체의 권리, 의무 및 그 행사방법 이용자는 개인정보주체로서 권리 행사할 수 있습니다. 개인정보 열람요구 오류 등이 있을 경우 정정 요구 삭제요구 처리 정지 요구 당사는 개인정보를 저장하거나 위탁하지 않습니다. 개인정보의 파기 당사의 어플리케이은 독립 실행 방식의 어플리케이...

알람시계무료 어플리케이션 개인정보처리방침

  개인정보처리방침 알람시계 어플리케이션은 개인정보보호법에 따라 이용자들의 개인정보 보호 및 권익을 보호하고자 다음과 같은 처리방침을 두고 있습니다. 당사는 개인정보처리방침을 개정하는 경우 앱 화면 및 웹사이트 공지사항을 통하여 공지할 것입니다. 개인정보의 처리 목적 본 어플리케이션은 개인정보를 수집하지 않는 독립 실행형 어플리케이션으로 별도의 서버를 운영하거나 정보를 수집하지 않습니다. 당사에서 개인정보를 별도로 저장하거나 이용하지 않습니다. 당사는 안드로이드 서비스 기능을 이용하기 위한 기능과 광고서비스 등에서 특정 개인과 직접적인 관련이 없는, 개인식별이 불가능한 정보를 수집할 수 있습니다. Google AdMob Firebase Analytics Firebase Crashlytic 개인정보 파일 현황 당사는 별도의 개인정보 파일을 사용하지 않으며 저장하지도 않습니다. 당사는 쿠키를 저장하지 않으며 이용하지 않습니다. 단, 스토어 서비스가 이용하는 정보 및 광고서비스가 이용하는 정보는 해당 서비스의 SDK를 거쳐 이용하게 됩니다. 이는 당사에 저장되는 정보가 아닙니다. 이용자가 이에 대해 의문이 있다면 해당 서비스(구글 및, 각 광고 미디어)로 직접 연락해야 합니다. 개인정보의 처리 및 보유기간 당사는 개인정보를 직접적으로 저장하거나 보유하지 않습니다. 당사의 어플리케이션은 모두 해당 미디어서비스(애플, 구글 ,광고미디어)의 SDK를 통해 간접적으로 이용합니다. 따라서 당사는 이용자의 개인정보를 처리하는 내용도 보유기간도 없습니다. 개인정보의 제3자 제공에 관한 사항 당사는 개인정보를 제3자에게 제공하지 않고 있습니다. 개인정보처리 위탁 당사는 개인정보를 위탁하고 있지않습니다. 정보주체의 권리, 의무 및 그 행사방법 이용자는 개인정보주체로서 권리 행사할 수 있습니다. 개인정보 열람요구 오류 등이 있을 경우 정정 요구 삭제요구 처리 정지 요구 당사는 개인정보를 저장하거나 위탁하지 않습니다. 개인정보의 파기 당사의 어플리케이은 독립 실행 방식의 어플리...