답변:
당신은 이것을 할 수 있습니다 Activity.overridePendingTransition()
. XML 리소스 파일에서 간단한 전환 애니메이션을 정의 할 수 있습니다.
onCreate
기능 에서이 작업을 수행 할 수 있습니다 .
다음은 두 가지 활동 사이에서 부드럽게 페이드를 수행하는 코드입니다.
라는 파일 만들기 fadein.xml
에을res/anim
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="2000" />
라는 파일 만들기 fadeout.xml
에을res/anim
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />
활동 A 에서 활동 B 로 페이드 하려면 다음 onCreate()
을 활동 B 의 방법에 넣으십시오 . setContentView()
나를 위해 일 하기 전에 .
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
페이드가 너무 느리면 android:duration
위의 xml 파일에서 더 작은 것으로 변경 하십시오.
overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);
해당 파일을 보면 사용자 정의 애니메이션을 개선하는 방법에 대한 힌트를 얻을 수도 있습니다 (예 : 페이드 아웃보다 페이드 인을 길게하는 방법).
fadein
과 fadeout
에 fade_in
와 fade_out
. Dan J의 포스트에서
overridePendingTransition()
전화 한 직후에 전화 해야합니다 . 새로운 활동을 시작한 직후에 전화 하여이 방법으로 멋진 페이드를 얻을 수있었습니다. finish()
startActivity()
가장 쉬운 방법은 다음과 같습니다.
<style name="WindowAnimationTransition"> <item name="android:windowEnterAnimation">@android:anim/fade_in</item> <item name="android:windowExitAnimation">@android:anim/fade_out</item> </style>
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar"> <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style>
그게 다야 :)
예. 활동에 어떤 종류의 전환이 필요한지 OS에 알릴 수 있습니다.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().setWindowAnimations(ANIMATION);
...
}
여기서 ANIMATION은 OS에 내장 된 애니메이션을 나타내는 정수입니다.
res> anim> fadein.xml 생성
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" />
res> anim> fadeout.xml 생성
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />
res> values> styles.xml에서
<style name="Fade">
<item name="android:windowEnterAnimation">@anim/fadein</item>
<item name="android:windowExitAnimation">@anim/fadeout</item>
</style>
onCreate () 활동에서
getWindow().getAttributes().windowAnimations = R.style.Fade;
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
기본 애니메이션 목록은 http://developer.android.com/reference/android/R.anim.html을 참조하십시오.
사실이 fade_in
및 fade_out
API 레벨 1 위로합니다.
기본 활동 애니메이션을 덮어 씁니다. API 15에서 원활하게 작동하는지 테스트합니다. 내가 사용하는 솔루션은 다음과 같습니다.
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorPrimary</item>
<item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>
</style>
<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
<item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
<item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
<item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
res 폴더 아래에 anim 폴더를 만든 다음이 네 개의 애니메이션 파일을 만듭니다.
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-100%p"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="100%p"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
샘플 프로젝트를 다운로드 할 수 있습니다 .
그게 다야... :)
다음은 두 활동을 원활하게 수행하는 코드입니다.
왼쪽에서 오른쪽으로 부드러운 효과
res / anim에 slide_in_right.xml 및 slide_out_right.xml이라는 파일을 만듭니다.
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
<translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
<alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >
<translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
<alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
</set>
오른쪽에서 왼쪽으로 부드러운 효과
res / anim에 animation_enter.xml 및 animation_leave.xml이라는 파일을 만듭니다.
animation_enter.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:fromXDelta="-100%" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700"/>
</set>
animation_leave.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="700" />
</set>
한 활동에서 두 번째 활동으로 이동
Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
startActivity(intent_next);
finish();
4. 백 프레스 이벤트 또는 두 번째 활동에서 하나의 활동으로 이동
Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
startActivity(home_intent);
finish();
overridePendingTransition
즉시 후 startActivity를 : developer.android.com/reference/android/app/...
Android 1.5에서는 overridePendingTransition을 사용할 수 없습니다. overridePendingTransistion이 Android 2.0에 제공되었습니다.
오류 없이이 작업을 수행하려면 일반 애니메이션 (또는 자신의)을 사용하여 대상 (1.5 이상)을 컴파일하거나 overridePendingTransistion을 사용하여 대상 (2.0 이상)을 컴파일해야합니다.
요약 : Android 1.5에서는 overridePendingTransistion을 사용할 수 없습니다 .
OS에서 내장 애니메이션을 사용할 수 있습니다.
갤럭시 기기에서 :
설정> 개발자 옵션을 사용하여 장치에서 장치를 끄지 않았는지 확인해야합니다.
ActivityCompat.startActivity () 사용 API> 21 작동합니다.
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
ActivityCompat.startActivity(activity, intent, options.toBundle());
일부 Android 버전은 사용자 지정 Activity
전환을 지원 하고 일부는 지원 하지 않습니다 (이전 장치). 사용자 정의 전환을 사용하려면 이전 버전과 Activity
달리 overridePendingTransition()
메소드 가 있는지 확인하는 것이 좋습니다 .
메소드가 존재하는지 여부를 알기 위해 reflection API를 사용할 수 있습니다. 존재하는 경우 메소드를 확인하고 리턴하는 간단한 코드는 다음과 같습니다.
Method mOverridePendingTransition;
try {
mOverridePendingTransition = Activity.class.getMethod(
"overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
/* success */
} catch (NoSuchMethodException nsme) {
/* failure, this version of Android doesn't have this method */
}
그런 다음 자체 전이를 적용 할 수 있습니다 (예 :이 방법이있는 경우 사용).
if (UIConstants.mOverridePendingTransition != null) {
try {
UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
예를 들어, 간단한 페이드 인 및 페이드 아웃 애니메이션이 전환 데모에 사용되었습니다.
애니메이션 축소
Intent i = new Intent(getApplicationContext(), LoginActivity.class);
overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();
zoom_enter
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="500" />
zoom_exit
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0"
android:fillAfter="true"
android:duration="500" />
overridePendingTransition
아래의 모든 관련 답변에 적용됩니다(0, 0)
. 애니메이션을 전혀 원하지 않으면 전달할 수 있습니다 .