본문 바로가기

ANDROID/UI - UX

[안드로이드] Custom animation 정의를 통한 액티비티 전환 애니메이션 적용하기, static 클래스 내부에서 overridePendingTransition 사용하기

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);


기존에는 위와 같은 간단한 안드로이드 기본 애니메이션을 활용해서 


액티비티 전환 애니메이션을 사용했는데, 단순한 Fade in, fade out을 떠나 


슬라이드 쇼처럼 위 혹은 옆에서 액티비티 화면이 들어올 수 있도록 하고 싶었고,


서치를 통해 아주 유용한 페이지를 찾았다.



http://wimir-dev.tistory.com/23



참조한 페이지를 통해


프로젝트의 res 폴더에 anim 리소스 폴더를 만들고,


slide_up.xml, slide_down.xml 을 생성


이를 아래와 같이 적용해 응용하였다.


overridePendingTransition(R.anim.slide_down, android.R.anim.fade_out);


불러올 액티비티를 startActivity로 불러주고, 다음 부분에 이렇게 정의해주면


새로 불러오는 액티비티가 위에서 아래로 내려오고, 기존의 액티비티는 점차 어두워지는 fade out 효과를 가지게 된다.


여기서 주목할 점은 커스텀으로 만든 애니메이션인 slide_up, slide_down 파일안의 fromXDelta, toXDelta 값인데,


<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="350"
android:fromXDelta="-100%p"
android:toXDelta="0%p"/>


애니메이션 값으로 fromYDelta, toYDelta도 존재하므로 동일한 방식으로 


두 파일을 추가해 액티비티를 왼쪽, 혹은 오른쪽에서 밀어오는 효과도 만들 수 있다는 것이다.


<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:duration="350"
android:fromYDelta="0%p"
android:toYDelta="-100%p" />


추가로 interpolator를 xml 파일에 설정해 가속하거나 감속하는 등의 옵션은 물론, duration 조절로 애니메이션 수행 시간을


설정도 가능하다. 


여기다가 안드로이드 기본 애니메이션 값까지 가져와 화면 슬라이드 및 fade in fade out 까지 함께


적용하는 것도 가능하지 않을까? 하는 생각도 드는데, 나중에 한번 시도해 보는 걸로 해야겠다.





추가로 이를 Swipe 뷰를 생성하는 onCreateView 함수 안에서 불러오고자 했는데, 


onCreate 안에서 쓰듯이 overridePendingTransition을 적용하면 onCreateView가


static으로 사용하는 PlaceholderFragment 내부에 선언되어 있기 때문에 사용할 수 없었다.


이건 이거대로 또 검색을 했고, stack overflow에서 힌트를 얻을 수 있었다.



https://stackoverflow.com/questions/22354076/is-there-a-way-to-call-overridependingtransition-from-a-class-that-does-not-ex



어쨌든 질문의 요지는 Activity 클래스를 확장받지 않은 부분에서 overridePendingTransition을 사용하는 법에 대한 것이었는데,


위의 답변과 같이 따로 context를 검사해야 하는지에 대한 의문이 들었고


If문 없이 Activity를 단순히 참조해 비슷하게 수행해보기로 했다.


(getActivity()).overridePendingTransition(R.anim.slide_down, android.R.anim.fade_out);


결과는 성공적이었다. 우선 아무리 다른 class 안에서 특정 작업을 수행한다 해도, 이 클래스가 Activity 클래스 내부에 선언되어 있다면


위와 같이 getActivity를 통해 액티비티에 딸린 작업들을 행할 수 있는 것이었다. :)