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) 일단 다른 방법을 찾지 못해서 이번 개발은 여기에서 마무리 하는걸로.

댓글

이 블로그의 인기 게시물

인플비서 개인정보 처리방침

lemoncat 레몬캣 개인정보처리방침

안드로이드 깃허브 git ignore 파일 설정