Jak zapewnić animację podczas wywoływania innej aktywności w systemie Android?


115

Mam dwa działania A i B. Chcę mieć zmniejszoną animację, gdy działanie A wywołuje B i zmaksymalizować animację, gdy działanie B wywołuje A. Nie potrzebuję do tego plików animacji xml.

Kiedy wywołujemy inne działanie w systemie Android, wyświetla domyślną animację, a następnie wywołuje animację zmniejszania.

Chcę, aby domyślna animacja nie wystąpiła, a animacja, której chcę, powinna się pojawić.

Czy faktycznie możemy podać animację, wywołując inne działanie?

Odpowiedzi:


144

Od API 16 możesz dostarczyć pakiet opcji aktywności podczas wywoływania Context.startActivity (Intent, Bundle) lub powiązanych metod. Jest tworzony za pomocą kreatora ActivityOptions :

Intent myIntent = new Intent(context, MyActivity.class);
ActivityOptions options = 
   ActivityOptions.makeCustomAnimation(context, R.anim.fade_in, R.anim.fade_out);
context.startActivity(myIntent, options.toBundle());

Nie zapomnij sprawdzić innych metod kreatora ActivityOptions i ActivityOptionsCompat, jeśli korzystasz z biblioteki pomocy technicznej.



API 5+:

W przypadku aplikacji przeznaczonych dla poziomu API 5+ istnieje overridePendingTransitionmetoda Działania . Animacje przychodzące i wychodzące wymagają dwóch identyfikatorów zasobów. Identyfikator 0wyłączy animacje. Zadzwoń natychmiast po startActivityrozmowie.

to znaczy:

startActivity(new Intent(this, MyActivity.class));
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

API 3+:

Możesz zablokować domyślną animację (wsuń się z prawej strony), umieszczając Intent.FLAG_ACTIVITY_NO_ANIMATIONflagę w zamiarze.

to znaczy:

Intent myIntent = new Intent(context, MyActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(myIntent);

następnie w swoim działaniu musisz po prostu określić własną animację.

Działa to również w przypadku interfejsu API 1.5 (poziom 3).


4
Co masz na myśli, mówiąc „określ własną animację”? Jak Ty to robisz? Dzięki!
pqn

Mam to samo pytanie. Prawdopodobnie w animacji startowej w onResume i onPause.
Tima

czy zamiast tego można użyć Animatora?
programista Androida

Możesz również użyć tego samego po wywołaniu finish ()!
thiagolr

Czy R.anim.fade_innadal nie jest animacją pliku xml, którą przypuszczamy, że mamy w niej res\anim ?
Alex Jolig

78

Aby to osiągnąć, należy użyć metody OverridePendingTransition, która znajduje się w klasie Activity . Przykładowe animacje w folderze res / anim przykładu apidemos. Sprawdź to. Więcej niż sprawdź demo w ApiDemos / App / Activity / Animation .

Przykład:

@Override
public void onResume(){
    // TODO LC: preliminary support for views transitions
    this.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}

1
Dziękuję za odpowiedź. Metoda overridePendingTransition jest obsługiwana od poziomu interfejsu API 5 i chcę, aby aplikacja była obsługiwana z systemu Android 1.5. Czy istnieje inny sposób na zapewnienie animacji z jednego działania do drugiego?
sunil

5
niesamowite! to świetna zabawa
Someone Somewhere

@sunil mam takie samo pytanie jak twoje. czy mógłbyś rozwiązać problem? animacja z interfejsem API na poziomie 3 lub 4 (nie 5)
Dr.Jacky,

zachowanie kodu animacji w onResume () spowoduje odtworzenie animacji, gdy użytkownik wyjdzie z aplikacji i wróci. Nie jest idealny w wielu aplikacjach.
Vihaan Verma

Musiałem dodać super.onResume();, otrzymywałem: „android.util.SuperNotCalledException: Activity {com.abc.MyActivity} nie nawiązało połączenia z super.onResume ()”
Gene Bo


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.