Android의 활동 전환


188

Android 1.5 이상의 두 활동 간 전환을 어떻게 정의 할 수 있습니까? 활동이 바래지고 싶습니다.


7
overridePendingTransition아래의 모든 관련 답변에 적용됩니다 (0, 0). 애니메이션을 전혀 원하지 않으면 전달할 수 있습니다 .
dokkaebi

답변:


164

당신은 이것을 할 수 있습니다 Activity.overridePendingTransition(). XML 리소스 파일에서 간단한 전환 애니메이션을 정의 할 수 있습니다.


감사합니다 iandisme. overridePengingTransition은 API 레벨 5입니다. 레벨 3 (Android 1.5)에서는이 작업을 수행 할 수 없습니까?
hpique

아 맞아. CaseyB의 답변은 아마도 당신이 찾고있는 라인을 따라 더 많을 것입니다.
iandisme

CaseyB의 답변으로 적절한 페이드를 수행하는 방법을 아직 찾지 못했습니다.
hpique

1
액티비티 onCreate기능 에서이 작업을 수행 할 수 있습니다 .
mxcl

1
HTC에서는 작동하도록 (또는 적어도 HTC Desire HD에서) 설정> 디스플레이> 애니메이션을 모두 변경해야합니다.
Urboss

192

다음은 두 가지 활동 사이에서 부드럽게 페이드를 수행하는 코드입니다.

라는 파일 만들기 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 파일에서 더 작은 것으로 변경 하십시오.


54
이것에 추가하십시오. OS가 활동을 종료하기로 결정한 직후 overridePendingTransition ()을 다시 호출해야합니다. 방금 Activity의 onPause () 메소드에 overridePendingTransition (fadein, fadeout)을 호출했습니다. 그렇지 않으면 활동 페이드 인이 표시되지만 닫을 때 페이드 아웃되지는 ​​않습니다.
Nate

2
다른 스레드에 대한 답변이 없습니다. 삭제하고 있습니다. 내가 겪고있는 일은 전환이 즉시 발생하고 어두워지고 페이드 인되는 것입니다. 그래서 나는 활동 A에 있고 활동 B가 표시되고 흐려지고 페이드 인됩니다. 그런 다음 지침에 따라 수정하십시오. 활동 A의 onPause ()에 코드를 추가하고 동일한 동작을 얻습니다.
포옹에 괴짜

12
내장 된 Android 애니메이션을 사용하면 전환이 더 순조롭게 진행되는 것 같습니다. overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); 해당 파일을 보면 사용자 정의 애니메이션을 개선하는 방법에 대한 힌트를 얻을 수도 있습니다 (예 : 페이드 아웃보다 페이드 인을 길게하는 방법).
Dan J

3
그냥 변화에 깜빡하지 않는 fadeinfadeoutfade_infade_out. Dan J의 포스트에서
Farid

2
문서에 따르면 및 / 또는에 overridePendingTransition()전화 한 직후에 전화 해야합니다 . 새로운 활동을 시작한 직후에 전화 하여이 방법으로 멋진 페이드를 얻을 수있었습니다. finish()startActivity()
Ionoclast Brigham

50

가장 쉬운 방법은 다음과 같습니다.

  1. styles.xml 파일에 애니메이션 스타일 만들기
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. 이 스타일을 앱 테마에 추가
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

그게 다야 :)


31

예. 활동에 어떤 종류의 전환이 필요한지 OS에 알릴 수 있습니다.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

여기서 ANIMATION은 OS에 내장 된 애니메이션을 나타내는 정수입니다.


작동하려면 다른 작업을 수행해야합니까? getWindow (). setWindowAnimations (android.R.anim.fade_in)은 기본적으로 사용 된 푸시 전환을 일으키지 않지만 페이드 전환도 아닙니다. 새로운 활동은 Nexus One 기기의 이전 활동 위에 나타납니다.
hpique

1
리소스를 요구하지 않고 OS에 내장 된 전환 애니메이션의 ID를 요구하기 때문입니다. developer.android.com/intl/fr/reference/android/view/…
CaseyB

4
setWindowAnimations는 스타일 자원 만 허용하는 것 같습니다. getWindow (). setWindowAnimations (android.R.style.Animation_Toast)는 내가 가장 페이드 인한 것으로 보이지만 이전 활동이 아닌 검은 색으로 사라집니다.
hpique

1
OS에서 애니메이션으로 만들 필요는 없으며 값으로 사용자 정의 애니메이션을 정의 할 수 있습니다.
ilija139

1
@ ilija139, 확실합니까? " developer.android.com/reference/android/view/… " 라고 말합니다 . "이것은 시스템 리소스 여야합니다. 윈도우 관리자가 응용 프로그램에 액세스 할 수 없기 때문에 응용 프로그램 리소스 일 수 없습니다."
lapis

29

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;

2
테마에 추가하여 모든 활동에 적용하도록 제안 하시겠습니까?
Peterdk

12
이러한 애니메이션은 이미 Android에서 정의되어 있으므로 모든 활동의 onPause ()에 다음 코드를 추가하기 만하면됩니다.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

예, 개발자가 원하는대로 애니메이션을 편집 할 수 있음을 보여주고 싶었습니다.
IceSteve


25

기본 활동 애니메이션을 덮어 씁니다. 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>

샘플 프로젝트를 다운로드 할 수 있습니다 .

그게 다야... :)


수락 된 답변이어야합니다. 잘 작동합니다!
EdgeDev

24

다음은 두 활동을 원활하게 수행하는 코드입니다.

  1. 왼쪽에서 오른쪽으로 부드러운 효과

    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>
  2. 오른쪽에서 왼쪽으로 부드러운 효과

    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>
  3. 한 활동에서 두 번째 활동으로 이동

       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();

3
overridePendingTransition은 3에서 startActivity 뒤에 있어야합니다.
arberg

overridePendingTransition은 3과 4의 startActivity 뒤에 있어야합니다
Tareq

overridePendingTransition ()이 startActivity () 앞에 놓이면 작동하지 않습니다.
Fernando Tan

호출해야합니다 overridePendingTransition즉시 startActivity를 : developer.android.com/reference/android/app/...
Midhun MP

4

Android 1.5에서는 overridePendingTransition을 사용할 수 없습니다. overridePendingTransistion이 Android 2.0에 제공되었습니다.

오류 없이이 작업을 수행하려면 일반 애니메이션 (또는 자신의)을 사용하여 대상 (1.5 이상)을 컴파일하거나 overridePendingTransistion을 사용하여 대상 (2.0 이상)을 컴파일해야합니다.

요약 : Android 1.5에서는 overridePendingTransistion을 사용할 수 없습니다 .

OS에서 내장 애니메이션을 사용할 수 있습니다.


맞지 않습니다. 애니메이션은 1.6 이전의 Android에 있으며 리플렉션과 함께 overridePendingTransistion을 사용하여 1.5를 계속 타겟팅 할 수 있습니다.
hpique

글쎄, 내 실수 내 게시물을 업데이트했습니다. 1.5에서 원하는대로 자신 만의 애니메이션을 만들고 사용자 지정할 수 있습니다. 그러나 overridePendingTransition은 API 레벨 5에 나타나기 시작한 이후에도 계속 사용할 수 없습니다.
Curtain

2

갤럭시 기기에서 :

설정> 개발자 옵션을 사용하여 장치에서 장치를 끄지 않았는지 확인해야합니다.

두 머펫


LG 기기의 경우에도 :)
Ultimo_m

나는 그렇게 생각하지만, 나는 그것을 시도하지 않습니다
Maher Ismaail

환상적인! 몇 시간 동안 전환 및 애니메이션을 검색 한 후 답변을 찾았습니다.
CoolMind

1

ActivityCompat.startActivity () 사용 API> 21 작동합니다.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

1

의도를 시작하기 전에 :

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

액티비티 전환에 기본 애니메이션이 제공됩니다.


0

일부 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();
               }
            }

예를 들어, 간단한 페이드 인 및 페이드 아웃 애니메이션이 전환 데모에 사용되었습니다.


0

애니메이션 축소

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" />
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.