Android (안드로이드)

[Android] 화면 전환 애니메이션 효과 / 액티비티 전환 애니메이션 효과 / overridePendingTransition / overrideActivityTransition

Oscar:) 2024. 6. 7. 18:20

 
 
액티비티 전환 시 애니메이션 효과를 적용해보자.
 
 
액티비티가 전환될 때 애니메이션을 적용하지 않은 기본 상태에서는 화면이 아래에서 위로 올라온다.
 
이번 포스팅에서는 위아래가 아닌, 좌우로 이동하는 느낌의 애니메이션을 적용해볼 것이다.
 
 
 


애니메이션 파일 만들기

 
 
화면 전환에 적용할 애니메이션 효과를 직접 지정해줘야 한다.
 
 
애니메이션 파일에 대한 기본 개념이 부족하다면 옛 포스팅을 참고하기 바란다.
 

 

[Android] 애니메이션 효과 / animation / View 움직임, 이동 / 트윈 애니메이션

이번 포스팅에서는 View 에 애니메이션 효과를 부여함으로써, 앱에 생동감을 불어 넣어주는 작업을 해볼 것이다. 안드로이드에서 애니메이션을 적용할 수 있는 방법은 다양하다. 비트맵 애니메

oscarstory.tistory.com

 


 
 
이번 포스팅에서 사용할 애니메이션 파일은 3개다.
 
- right_transition.xml : 화면이 오른쪽으로 이동 + 투명도가 점점 흐려짐
- left_transition.xml : 화면이 왼쪽으로 이동 + 투명도가 점점 선명해짐
- none.xml : 아무런 효과 없음
 
none 애니메이션 파일아무런 애니메이션을 적용하지 않겠다는 것을 선언하는 느낌으로 사용된다.
 
 
 

✅ right_transition.xml

<translate
	android:fromXDelta="0%"
	android:toXDelta="50%"
	android:duration="250"
	/>
    
<alpha
	android:fromAlpha="1.0"
	android:toAlpha="0.0"
	android:duration="250"
	/>

 
먼저, 오른쪽으로 이동하는 애니메이션이다.
화면 오른쪽(바깥)으로 나가면서 사라지는 듯한 세팅이다.
 

- fromXDelta="0%" : 중앙(제자리)으로부터 시작하여
- toXDelta="50%" : 해당 View의 절반 크기만큼 오른쪽으로 이동한다
- fromAlpha="1.0" : 최대 투명도로 시작하여
- toAlpha="0.0" : 화면에서 사라진다
- duration="250" : 0.25초 지속

 
 
 

✅ left_transition.xml

<translate
	android:fromXDelta="50%"
	android:toXDelta="0%"
	android:duration="250"
	/>
    
<alpha
	android:fromAlpha="0.0"
	android:toAlpha="1.0"
	android:duration="250"
	/>

 
왼쪽으로 이동하는 애니메이션이다.
화면 오른쪽(바깥)에서부터 가운데로 나타나는 세팅이다.
 

- fromXDelta="50%" : 해당 View의 절반 크기만큼 오른쪽으로부터 시작하여
- toXDelta="0%" : 중앙(제자리)으로 이동한다
- fromAlpha="0.0" : 화면에 없는상태로 시작하여
- toAlpha="1.0" : 최대 투명도로 나타난다
- duration="250" : 0.25초 지속

 
 
 

✅ none.xml

<translate
	android:duration="100"
	android:fromXDelta="0%"
	android:fromYDelta="0%"
	android:toXDelta="0%"
	android:toYDelta="0%"
	/>

 
아무런 애니메이션을 적용하지 않기 위한 애니메이션 파일이다.
duration 속성도 사실 형식적인 것일 뿐, 모든 속성값을 0 처리해준다.
 
 
 


overridePendingTransition()

 
 
overridePendingTransition() 메서드는 Activity 클래스에 포함되어있다.
따라서 Activity 또는 AppCompatActivity를 상속하는 모든 액티비티에서 사용할 수 있다.
 
 
 
기본 문법은 다음과 같다.

overridePendingTransition(enterAnim, exitAnim)

 
Activity 클래스에서는 위와 같이 설명하고 있으며, 단어 그대로 직역하면 이해하기 어렵진 않다.
 

enter : 들어가다(진입하다)
exit : 나가다

 
 
 
하지만 막상 위 단어의 뜻처럼 사용하진 않고, Activity 생명주기에 맞춰 사용한다.

override fun onCreate() {
	...
    overridePendingTransition(R.anim.left_transition, R.anim.none)
}

override fun onPause() {
	...
    overridePendingTransition(R.anim.none, R.anim.right_transition)
}

 
생명주기의 흐름과 같이 이해하면 별로 어렵지 않을 것이다.
Activity가 생성될 때와 정지될 때 애니메이션을 세팅하는 것이다.
 
 
onCreate() 메서드에서는 enterAnim 인수로 left_transition을 적용하고,
exitAnim 인수로는 none을 적용해준다.
 
반대로, onPause() 메서드에서는 enterAnim 인수에 none을,
exitAnim 인수에 right_transition을 적용해준다.
 
none.xml이 들어갈 인수에 0을 세팅하게되면 검은 화면이 출력되기 때문에,
번거롭지만 none.xml 파일을 만들어서 적용해준 것이다.
 
 
 
참고로 액티비티가 정지될 때의 애니메이션 세팅은 onPause()가 아닌
onStop(), onDestroy() 메서드에서는 작동하지 않으니 주의바란다.
 
 
 


overrideActivityTransition()

 
 
Android SDK 34 버전부터 overridePendingTransition() 메서드가 Deprecated 되었다.
따라서 해당 버전부터는 overrideActivityTransition() 메서드를 사용해야 한다.
 
 
 
기본 문법은 다음과 같다.

overrideActivityTransition(overrideType, enterAnim, exitAnim)

 
2,3번째 인수는 overridePendingTransition() 메서드와 동일한 역할을 수행하고,
첫 번째 인수가 새로 추가되었다고 볼 수 있다.
 
 
overrideType 인수에는 열기 / 닫기를 세팅해주면 된다.

override fun onCreate() {
	...
    overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, R.anim.left_transition, R.anim.none)
}

override fun onPause() {
	...
    overrideActivityTransition(Activity.OVERRIDE_TRANSITION_CLOSE, R.anim.none, R.anim.right_transition)
}

 
 
 
결론적으로, Android SDK 버전별로 분기처리를 해주면 된다.

override fun onCreate() {
	...
    if (Build.VERSION.SDK_INT >= 34) {
    	overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, R.anim.left_transition, R.anim.none)
    } else {
    	overridePendingTransition(R.anim.left_transition, R.anim.none)
    }
    
}

override fun onPause() {
	...
    if (Build.VERSION.SDK_INT >= 34) {
    	overrideActivityTransition(Activity.OVERRIDE_TRANSITION_CLOSE, R.anim.none, R.anim.right_transition)
    } else {
    	overridePendingTransition(R.anim.none, R.anim.left_transition)
    }
    
}

 
 
 
이제 Intent를 활용한 startActivity() 메서드로 액티비티를 전환해보자.
 
 
 


결과

 
 

✅ 액티비티 전환 - 기본

 
아무런 애니메이션도 적용하지 않으면, 위와 같이 새로운 액티비티가 올라온다.
 
 
 

✅ 액티비티 전환 - 애니메이션 적용 

 
투명도를 조절하며 좌우로 이동하는 애니메이션 효과를 적용했다.
 
 
 


 
 
 
시중에 나와있는 많은 앱들은 대부분 액티비티 전환 시 애니메이션 효과가 적용되어 있다.
 
이제 그만 딱딱한 기본 애니메이션은 놓아주고, 내 앱만의 특별한 애니메이션을 적용해주자.