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?

sunil
źródło

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).

whlk
źródło
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);
}
Praveen
źródło
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
3

Jelly Bean obsługuje to za pomocą metody ActivityOptions.makeCustomAnimation () . Oczywiście, ponieważ jest tylko na Jelly Bean, jest praktycznie bezwartościowy ze względów praktycznych.

phreakhead
źródło
5
To już nie jest bezwartościowe :)
Greg Ennis,
Użyj, ActivityOptionsCompatjeśli kierujesz reklamy przed JellyBean.
Thuy Trinh