overridePendingTransition을 사용하여 Activity의 화면 전환 시 애니메이션을 적용하려고 했으나 Deprecated 되었다고 하여 해결할 방법을 찾아보았다. API 버전이 34 이상일 경우에는
overrideActivityTransition
을 사용하고 미만일 경우에는overridePendingTransition
를 사용하여 문제를 해결하였다.
- 왼쪽에서 오른쪽으로 슬라이드 하면서 들어오는 애니메이션 코드
android:fromXDelta="-100%" : 디바이스 스크린 왼쪽부터
android:fromYDelta="0%" : 디바이스 스크린에 꽉 차는 형태로 이동한다는 의미
// horizon_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="-100%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXDelta="0%" />
</set>
// horizon_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXDelta="-100%" />
</set>
아무것도 안 하는 애니메이션 지정을 위한 애니메이션
공식 문서 상에서 overridePendingTransition의 인자로 0을 주면 아무런 애니메이션을 안한다고 되어 있지만 실제로는 검은 화면이 된다.
// none.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromXDelta="0%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
</set>
// verticla_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromYDelta="100%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="0%" />
</set>
// verticla_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="500"
android:fromYDelta="0%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="100%" />
</set>
overridePendingTransition(R.anim.none, R.anim.horizon_exit)
overridePendingTransition 함수는 두 개의 애니메이션 리소스를 함수 인자로 받는다.
첫 번째 인자는 새로 나타나는 화면이 취해야 하는 애니메이션
두 번째 인자는 지금 화면이 취하는 애니메이션이다.
overrideActivityTransition(Activity.OVERRIDE_TRANSITION_CLOSE, R.anim.none, R.anim.horizon_exit)
OVERRIDE_TRANSITION_CLOSE : 창이 닫혔을 때
OVERRIDE_TRANSITION_OPEN : 창이 열릴 때
abstract class AnimationActivity(
private val transitionMode: TransitionMode = TransitionMode.NONE
) : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
createTransitionAnimation()
}
override fun finish() {
super.finish()
exitTransitionAnimation()
}
private fun exitTransitionAnimation() {
val exitAnimResId = when (transitionMode) {
TransitionMode.HORIZON -> R.anim.horizon_exit
TransitionMode.VERTICAL -> R.anim.vertical_exit
else -> return
}
applyAnimationClose(R.anim.none, exitAnimResId)
}
private fun createTransitionAnimation() {
val enterAnimResId = when (transitionMode) {
TransitionMode.HORIZON -> R.anim.horizon_enter
TransitionMode.VERTICAL -> R.anim.vertical_enter
else -> return
}
applyAnimationOpen(enterAnimResId, R.anim.none)
}
private fun applyAnimationOpen(enterResId: Int, exitResId: Int) {
if (Build.VERSION.SDK_INT >= 34) {
overrideActivityTransition(
Activity.OVERRIDE_TRANSITION_OPEN, enterResId, exitResId
)
} else {
overridePendingTransition(enterResId, exitResId)
}
}
private fun applyAnimationClose(enterResId: Int, exitResId: Int) {
if (Build.VERSION.SDK_INT >= 34) {
overrideActivityTransition(
Activity.OVERRIDE_TRANSITION_CLOSE, enterResId, exitResId
)
} else {
overridePendingTransition(enterResId, exitResId)
}
}
enum class TransitionMode {
NONE,
HORIZON,
VERTICAL
}
}
class MyPageActivity : AnimationActivity(TransitionMode.HORIZON) {
class SignUpActivity : AnimationActivity(TransitionMode.VERTICAL) {