[Android / Kotlin] overridePendingTransition

Subeen·2023년 12월 29일
2

Android

목록 보기
27/73

overridePendingTransition을 사용하여 Activity의 화면 전환 시 애니메이션을 적용하려고 했으나 Deprecated 되었다고 하여 해결할 방법을 찾아보았다. API 버전이 34 이상일 경우에는 overrideActivityTransition을 사용하고 미만일 경우에는 overridePendingTransition를 사용하여 문제를 해결하였다.

애니메이션 xml

  • 왼쪽에서 오른쪽으로 슬라이드 하면서 들어오는 애니메이션 코드
    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>

AnimationActivity

  • 모든 액티비티에 애니메이션을 적용하기 위해 상속 클래스를 생성하여 사용한다.
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
    }
}

AnimationActivity 사용하기

class MyPageActivity : AnimationActivity(TransitionMode.HORIZON) {
class SignUpActivity : AnimationActivity(TransitionMode.VERTICAL) {

결과 화면

profile
개발 공부 기록 🌱

0개의 댓글