Jak wykonać animację zanikania przy przejściu aktywności?


89

Kodyfikuję efekt przejścia między moim działaniem związanym z logo a moim głównym działaniem, ale mam problem z tym, że przed zniknięciem aktywność przejdź na górę:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>

</set>

Jak mogę ulepszyć ten kod, aby uzyskać tylko znikający efekt?

Odpowiedzi:


237

Możesz utworzyć własne pliki animacji .xml, aby zanikać nowe Activityi znikać bieżące Activity:

fade_in.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" />

fade_out.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:fillAfter="true"
           android:duration="500" />

Użyj tego w kodzie w ten sposób: (Wewnątrz Activity)

Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

Powyższy kod zaniknie aktualnie aktywny Activityi zaniknie w nowo rozpoczętym, Activityco spowoduje płynne przejście.

AKTUALIZACJA : @Dan J zwrócił uwagę, że użycie wbudowanych animacji Androida poprawia wydajność , co rzeczywiście okazało się tak po wykonaniu kilku testów. Jeśli wolisz pracować z wbudowanymi animacjami, użyj:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

Zauważ, że odwołuję się android.Rzamiast Ruzyskać dostęp do identyfikatora zasobu.

AKTUALIZACJA : Obecnie powszechną praktyką jest wykonywanie przejść przy użyciu klasy Transition wprowadzonej na poziomie API 19 .


65
Wydaje się, że korzystanie z wbudowanych animacji systemu Android zapewnia płynniejsze przejście: przeglądanie overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);tych plików może również dać wskazówki, jak ulepszyć własne animacje (np. Przez wydłużenie czasu trwania przejścia niż zanikania).
Dan J

41
Ma undescore: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban

Czy muszę używać overridePendingTransition onCreate lub w każdej intencji? Czy zależy od tego, czego chcę? Dzięki.
Ricardo

19
Jest opcja bez "nadpisywania":Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd

1
Powyższe przejście jest wykonywane tylko wtedy, gdy jest włączone w opcjach programisty, patrz stackoverflow.com/a/30422015/2914140 .
CoolMind,

22

Po prostu prześlij odpowiedź przez oleynikd, ponieważ jest to proste i schludne

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);

Ponieważ overridePendingTransition nie działa w niektórych telefonach komórkowych, a rozwiązanie Enesa nie jest zbyt dobre, ta odpowiedź powinna być poprawna.
Hugo Passos

19

możesz również dodać animację do swojej aktywności, w metodzie onCreate jak poniżej, ponieważ overridePendingTransition nie działa z niektórymi telefonami komórkowymi lub zależy to od ustawień urządzenia ...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);

1
Jak obsłużyć animację dla poprzedniej lub rodzicielskiej aktywności?
Mehmed

9
Aby ustawić animację przejścia z powrotem do czynności rodzicielskiej, użyj tego kodu: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
John Verco

15

możesz również użyć tego kodu w swoim pliku style.xml , więc nie musisz pisać nic więcej w swoim pliku activity.java

<!-- 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/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AppTheme.WindowTransition</item>
</style>

<!-- Setting window animation -->
<style name="AppTheme.WindowTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.