Android

Android - Activity 화면 전환 효과

TechNote.kr 2016. 1. 18. 00:34
728x90

Google Play에서 설치한 app을 쓰다보면 아무런 효과 없이 Activity가 전환되는 app들도 있지만, Activity 전환시 신규 Activity가 오른쪽에서 왼쪽으로 나타난다거나, 자연스럽게 fade in/out 된다거나 하는 app들이 있다.


자세한 구현 방법을 알기 전, 아무런 기반 지식이 없는 상태에서 생각하기론 flash를 사용하나라고 추측만 했었다. 아무래도 animation 효과를 code 상으로 구현한다고는 감이 오지 않았기 때문이다.


이 효과의 주인공은 다음과 같다.

public void overridePendingTransition (int enterAnim, int exitAnim)

Added in API level 5

 Call immediately after one of the flavors of startActivity(Intent) or finish() to specify an explicit transition animation to perform next.


 As of JELLY_BEAN an alternative to using this with starting activities is to supply the desired animation information through a ActivityOptions bundle to {@link #startActivity(Intent, Bundle) or a related function. This allows you to specify a custom animation even when starting an activity from outside the context of the current top activity.

Parameters
enterAnim A resource ID of the animation resource to use for the incoming activity. Use 0 for no animation.
exitAnim A resource ID of the animation resource to use for the outgoing activity. Use 0 for no animation. 

[출처 : developer.android.com]



overridePendingTransition 를 호출하면서 2개의 인자를 넘기게 되는데 첫번째 인자는 새로 불리는 Activity의 애니메이션 효과, 두번째 인자는 기본 Activity의 애니메이션 효과이다.


그렇다면 저 인자에는 어떤 값들이 들어가야 할 것인가. type만 보면 int로 정수를 넣게 되어 있다.
enterAnim, exitAnim에도 설명이 되어 있지만 이 int는 resource ID로 애니메이션 효과를 정의한 resource의 ID를 넣어주면 된다.

애니메이션 효과의 resource는 res/anim에 위치하게 되고, R.anim.XXXXX으로 불리게 된다.

나의 코드 같은 경우는 다음과 같다.
startActivity(intent);
overridePendingTransition(R.anim.slide_left, R.anim.hold);

startActivity 이후에 호출하게 되고, 위 코드 같은 경우 신규 Activity는 오른쪽에서 왼쪽으로 이동하는 효과를
기존 Activity의 경우는 현상태를 그대로 유지하도록 하게 되어 있다.
(현상태를 그대로 유지할 꺼면 그냥 아무것도 넣지 않으면 되지 않을까 할 수도 있는데, 그냥 놔두면 화면 전환시 기존 Activity가 검은색으로 보여지게 된다.)

그렇다면 저 slide_left, hold는 어떻게 구현이 되어 있을까.

[slide_left]

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<set xmlns:android="http://schemas.android.com/apk/res/android"  android:interpolator="@android:anim/accelerate_interpolator">

<translate android:fromXDelta="100%p" android:toXDelta="0"
android:duration="@android:integer/config_shortAnimTime" />
</set>



[hold]

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="0" android:toXDelta="0"
android:duration="@android:integer/config_longAnimTime" />


각종 animation xml 들은 [Google Link] 에서 참고하면 될 것 같다.


728x90