AnimatedVisibility 애니메이션 끝났을 때를 아는 방법 - finishedListener
안드로이드 compose 개발
1. 현상황
아코디언 뷰를 만드는 데에 AnimatedVisibility를 사용하고 있다.
visible = state.isAcExpanded 로 visible을 관리하고 있으며, isAcExpanded가 true일 때 아코디언이 열린다.
2. 문제상황
아코디언이 열리고 난 뒤 스크롤을 맨 아래로 보내야 한다.
scrollState.animateScrollTo(scrollState.maxValue) 를 사용하면 되지만,
AnimatedVisibility에 애니메이션이 적용되어 있어, isAcExpanded의 값이 true로 바뀌는 즉시 scroll하면 제대로 적용되지 않는다.
즉, LaunchedEffect(state.isAcExpanded) 에서는 delay(300) 을 주는 등의 야매 처리를 하지 않으면 스크롤이 이동하지 않는 것이다.
처음: state.isAcExpanded = false
클릭함: state.isAcExpanded = true
!!!! 펼쳐지는중&스크롤 일어남 !!!!
▲ 위 상황에서 펼쳐지는 중의 scrollState.maxValue는 제대로 적용되지 않을 수밖에 없는 것.
정리하자면, 위에서 클릭함 상태일 때 스크롤은 아직 늘어나지 않은 상태인데 스크롤을 했다는 것이다.
3. 해결방안
animateContentSize 의 finishedListener 리스너를 달아서 사용한다.
이런 식.
근데 생각보다 애니메이션이 끝났다고 판정하는 시간이 늦다.
나는 다 펼쳐졌다고 생각했는데 거기서부터 0.1~0.2초 정도 후에 스크롤이 되곤 함.
4. 보완방안
애니메이션이 진행중인 상태에서도 스크롤 하도록 수정하기로 함.
1) isAcExpanded 를 Boolean에서 enum 값으로 바꿈(AcState)
2) isAcExpanded 가 바뀔 때마다 맨 아래로 스크롤 해주도록 수정
3) profit! 다만 조금 어색하게 보임. 값을 찍어보니 다음과 같이 나오더라.
4) 일단 다른 방법을 찾지 못해서 이번 개발은 여기에서 마무리 하는걸로.
댓글
댓글 쓰기