Wyłączyć animację wsuwania działań podczas uruchamiania nowej aktywności?

140

Mam czynność, która uruchamia inną czynność po kliknięciu przycisku. Domyślnie w nowszych wersjach systemu operacyjnego Android system operacyjny będzie animował nową aktywność przesuwając się od prawej do lewej.

Czy istnieje sposób na wyłączenie tej animacji? Chcę tylko, aby nowe działanie pojawiło się bez jakiejkolwiek animacji.

user246114
źródło

Odpowiedzi:

190

FLAG_ACTIVITY_NO_ANIMATIONFlag działa poprawnie wyłączyć animację podczas uruchamiania działalności.

Aby wyłączyć podobną animację, która jest wyzwalana podczas wywoływania finish()działania, tj. Zamiast tego animacja przesuwa się od prawej do lewej, możesz wywołać overridePendingTransition(0, 0)po wywołaniu, finish()a następna animacja zostanie wykluczona.

Działa to również w animacji, jeśli zadzwonisz overridePendingTransition(0, 0)po zakończeniu rozmowy startActivity(...).

Mattias
źródło
9
Należy pamiętać, że FLAG_ACTIVITY_NO_ANIMATIONi overridePendingTransitionto zarówno na poziomie API 5+ tylko.
azdev
Nie pomaga to podczas cofania się po naciśnięciu klawisza Wstecz.
Yar
4
Jesteście najlepsi. overridePendingTransition (0, 0) -> jest boskie. Zastępuje tylko animację finish (), ale nie animację uruchamianą podczas wznawiania poprzedniej czynności.
Philipp Jahoda
1
Nie podoba mi się ta odpowiedź, ponieważ nie obejmuje ona przejść spowodowanych naciśnięciem klawiszy funkcyjnych „wstecz”. OP pyta, jak „wyłączyć” animację, a nie „selektywnie nakazać aplikacji, aby jej nie odtwarzała”
1owk3y
3
Jeśli chcesz wyłączyć lub nadpisać również animację „wstecz”, zastąp metodę finish () w swoim działaniu i umieść tam to wywołanie wraz z wywołaniem super.finish (). Problem rozwiązany.
Grishka
171

IMHO ta odpowiedź tutaj rozwiązuje problem w najbardziej elegancki sposób.

Deweloper powinien stworzyć styl ,

<style name="noAnimTheme" parent="android:Theme">
  <item name="android:windowAnimationStyle">@null</item>
</style>

następnie w manifeście ustaw go jako temat działania lub całej aplikacji.

<activity android:name=".ui.ArticlesActivity" android:theme="@style/noAnimTheme">
</activity>

Voila! Miło i łatwo ...

ps kredyty dla oryginalnego autora ...

Ewoki
źródło
1
To nie działa dla Back i zmienia wygląd paska tytułowego (sprawia, że ​​jest mały) ...
Marek
czy na pewno nie dodałeś innych właściwości w stylu, bo nikt inny nie zgłosił tego "efektu", o którym wspominasz ..
Ewoks
Tylko dla odniesienia, może to spowodować problem w hierarchii widoków, w której musisz requestWindowFeature ().
Martin Marconcini,
byłoby miło, gdybyś trochę rozwinął, więc unikamy potencjalnych problemów
Ewoks
4
@Marek Chyba twój problem nie polega na poprawnej zmianie rodzic = "android: Theme". Powinieneś to zmienić za pomocą motywu, którego chcesz użyć, w zasadzie ten kod po prostu wyłącza określoną animację w motywie. na przykład użyj „Theme.AppCompat.Light.NoActionBar” zamiast „android: Theme”, a zrozumiesz, o co mi chodzi. Mam nadzieję, że to pomoże.
Recomer
33

Zastosować

startActivity(new Intent(FirstActivity.this,SecondActivity.class));

następnie

overridePendingTransition(0, 0);

Spowoduje to zatrzymanie animacji.

Siddharth_Vyas
źródło
28

Moim zdaniem najlepszą odpowiedzią jest użycie "overridePendingTransition(0, 0);"

aby uniknąć wyświetlania animacji, gdy chcesz Intentdo Activitywykorzystania:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);

i nie widzieć animacji po naciśnięciu przycisku Wstecz onPauseMetoda Zastąp w plikunewactivity

@Override
protected void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}
Sasa
źródło
19

Po prostu określ Intent.FLAG_ACTIVITY_NO_ANIMATIONflagę podczas uruchamiania

Alexander Kosenkov
źródło
13

To działa w przypadku wyłączania animacji zakończenia działania.

@Override
protected void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}
cmcromance
źródło
9

Jestem na 4.4.2 i wywołanie overridePendingTransition (0, 0) w działaniu uruchamiającym onCreate () wyłączy animację początkową (wywołanie overridePendingTransition (0, 0) natychmiast po startActivity () NIE zadziałało). Jak zauważono w innej odpowiedzi, wywołanie overridePendingTransition (0, 0) po finish () wyłącza animację zamykającą.

Przy okazji stwierdziłem, że ustawienie stylu za pomocą „android: windowAnimationStyle”> @ null (inna odpowiedź wymieniona tutaj) spowodowało awarię, gdy moja aktywność uruchamiania próbowała ustawić tytuł paska akcji. Dalsze debugowanie, odkryłem, że w jakiś sposób powoduje to niepowodzenie window.hasFeature (Window.FEATURE_ACTION_BAR) w initActionBar () działania.

Steve B.
źródło
1
co z jednym wznowieniem? pojedyncze najlepsze działania i tak dalej.
Lassi Kinnunen
7

FLAG_ACTIVITY_NO_ANIMATION może działać, ale nie załatwiło mi tego w połączeniu z FLAG_ACTIVITY_CLEAR_TASK i FLAG_ACTIVITY_NEW_TASK. Najwyraźniej widzę animację tworzenia nowego zadania ze świeżym stosem działań, gdy przechodzę w bok do moich innych widoków najwyższego poziomu.

To, co tutaj zadziałało, to wywołanie "overridePendingTransition (0, 0);" bezpośrednio po wywołaniu funkcji startActivity () lub onPause (). Oba sposoby działały, ale zrobienie tego po startActivity () daje mi trochę większą kontrolę nad tym, kiedy chcę animacje, a kiedy nie.

Wookie
źródło
2

Miałem podobny problem z wyświetlaniem czarnego ekranu podczas przesuwania przejścia z jednej czynności do drugiej za pomocą overridependingtransition. i poszedłem zgodnie z instrukcją poniżej i zadziałało

1) utworzył noanim.xmlfolder w anim

<?xml version="1.0" encoding="utf-8"?>
<translate 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="0%p" />

i używane

overridePendingTransition(R.drawable.lefttorightanim, R.anim.noanim);

Pierwszy parametr jako moja oryginalna animacja i drugi parametr, który jest animacją wyjścia jako moja sztuczna animacja

Karthika PB
źródło
1

W celu uniknięcia czarne tło, gdy zaczyna działalność już w stosie, dodałem overridePendingTransition(0,0)w onStart():

@Override
protected void onStart() {
    overridePendingTransition(0,0);
    super.onStart();

}
Alex Huiculescu
źródło