스토리 안드로이드 앱의 화면 전환 애니메이션 적용기
1. Shared Elements Transition이란?
화면과 화면의 공유요소를 통해 하나의 액티비티에서 동작하는 듯한 좀더 자연스러운 사용자 경험을 줄 수 있다.
shared와 다른 효과의 차이는 영상을 통해 비교하여 확인이 가능하다(아래 링크있음)
첫번째 View1을 클릭하여 ActivityB에 전달한 후 View2로 전달하여 View1과 동일한 위치 및 크기를 설정하여
애니메이션을 시작한다. 마지막으로 ActivitiyC에서 View2의 원래위치 크기로 돌아가여 실행한다.
2. 적용 방법(Android 5.0이상부터 사용가능)
테마의 스타일을 정의할 때 Transition을 추가
sharedElementEnterTransition이 ActivityB에 대한 효과이고 sharedElementExitTransition은 AcitivityA에 대한 효과이다.
스타일 테마 등록 후 -> 화면 전환에 사용되는 코드 작성
위에서 사용한 makeSceneTransitionAnimation의 함수 원형이다.
스타일 정의(MoveTransition Set)
각각 4가지 transitionSet의 의미:
위치와 크기 변경 / 배열과 회전을 변경 / 지정된 영역 변경 / 이미지 크기 및 배열 변경
마지막으로 이러한 형식으로 transition을 적용하면 된다.
3. 카카오스토리 적용 사례
FaceTransition은 얼굴 위주로 크롭하여 보여주는 기능(아래 링크 영상참조)-> 끊기지 않고 부드러워짐(매트릭스의 값이 달라지는 것을 막아줌)
현재 프레임을 캡쳐하여 비트맵으로 추출하여 사용한다.
프로필 진입(원에서 사각형으로 변경)
4. 이슈 및 해결
이슈1 -모서리의 라운드 이슈
원인 : 모서리의 라운드로 인하여 자연스럽지 않은 문제가 발생
해결 : 별도의 라운드 애니메이션을 적용한다(RoundTransition 생성)
RoundTransition을 구현하기 위해서는 Transition을 상속받아 구현해야 한다
Capture(시작과 종료화면을 캡쳐)->저장했던 Transition value가 파라미터로 전달되어 Animator생성에 사용한다
Capture
-public void captureStartValues(TransitionValues transitionValues)
-public void captureEndValues(TransitionValues transitionValues)
Animator
-public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues)
이슈2 - 연속클릭 이슈
원인 : 연속 클릭으로 인한 애니메이션 오류(startAcitivty 여러번 호출)
해결 : RxJava를 이용해 클릭 이벤트 흐름 제어
지속적으로 이벤트를 받아야 함으로 observer를 생성하고 여러개의 뷰에서 하나의 observable로 클릭이벤트를 전달하고
전달받은 함수를 throttleFirst를 통해 이슈 해결
이슈3 - 공유 뷰의 생성 지연
원인 : 공유 뷰의 생성 지연으로 애니메이션이 동작하지 못하고 화면 전환
해결 : 화면 전환 지연/ 화면 전환 시작 함수를 사용
PostponedEnterTransition으로 화면 전환을 멈추고 이미지 로드가 완료되면 다시 함수를 호출해 사용하느 ㄴ형식이다.
이슈4 - 종료 위치 찾지 못하는 이슈
원인 : 종료 애니메이션이 위치를 찾지 못하는 문제
해결 : 공유에 사용한 뷰는 사라지지 않도록 관리(ViewPager adapter의 notifyDataSetChanged()를 쓰지 않고 직접
UI에 접근하여 갱신)
포스팅한 내용은 아래 동영상을 참고하여 만들었습니다.
if(kakao)2020
오늘도 카카오는 일상을 바꾸는 중
if.kakao.com
'대외 활동 > CADI(개발A 보충스터디)' 카테고리의 다른 글
Array & ArrayList 알아보기 (0) | 2020.12.26 |
---|---|
안드로이드 계산기 어플 만들기! (0) | 2020.12.26 |
안드로이드 버전 카카오 T SDK 개발기 (0) | 2020.11.22 |
DatePickerDialog/TimePickerDialog 알아보기 (0) | 2020.10.27 |
CustomListView-3(kotlin) (0) | 2020.10.27 |