Jak mogę dodać animację do finish działania ()

98

Używam overridePendingTransition, gdy moje działanie jest tworzone i działa dobrze. Widzę, że zanikanie działa świetnie, ale kiedy próbuję animować zakończenie działania, nadal wykonuje domyślny slajd od prawej do lewej.

Po raz pierwszy próbowałem zdefiniować animację wyjściową, kiedy rozpoczynam ćwiczenie, w następujący sposób:

Intent myIntent = new Intent(a, SkdyAlert.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    a.startActivity(myIntent);
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
        AnimationHelper.overridePendingTransition(a, R.anim.fadein, R.anim.fadeout);
    }

Potem spróbowałem to zrobić, kiedy skończę ćwiczenie

okBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            finish();
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
                AnimationHelper.overridePendingTransition(activity, 0, R.anim.fadeout);
            }
        }
    });

Ale żadne z tych podejść nie zapobiegnie przesuwaniu się „od prawej do lewej” podczas animacji wyjścia. Jakieś pomysły na temat tego, co robię źle?

b-ryce
źródło

Odpowiedzi:

228

Nadpisuję oczekujące przejście zaraz po wywołaniu finish ();

W moim przypadku zrobiłem to, aby uniknąć przejść.

finish();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

Porządek jest ważny :)

Goofyahead
źródło
5
przez "Szczegóły", @Goofyahead nazywa swoją załączającą aktywność - ymmv. Ta technika pomogła mi zastąpić animację z Theme.Dialog w wersji 2.x, ale nie 3.x lub 4.x
larham1
8
Jak to R.anim.nothingwygląda?
sandalone
Użyj odpowiedzi @Felipe Micaroni Lalli, 0 oznacza brak animacji.
Yeung,
To też mi pomogło. Wyjaśnia, jak zdefiniować własne animacje: stackoverflow.com/questions/5151591/ ...
Adam
23
Możesz zmienić finish()metodę, aby uniknąć przejść we wszystkich przypadkach (wciśnięty przycisk Wstecz, jako przykład): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek
29

Na to pytanie już udzielono odpowiedzi, ale najskuteczniejszym sposobem umieszczenia animacji podczas wychodzenia z działania jest zastąpienie metody „finish ()” powiązanego działania:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}
Bahadir Tasdemir
źródło
24

Sugerowałbym użycie metody isFinishing () do skonfigurowania animacji w onPause zamiast wywoływania finish ()

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()){
        overridePendingTransition(R.anim.activity_slide_in, R.anim.activity_slide_out);
    }

}
Pablo A. Martínez
źródło
Dlaczego tak jest lepiej?
Manuel
20
finish();
overridePendingTransition(0, 0);
Felipe
źródło
19

Rozwiązałem ten problem, stosując takie podejście:

aby otworzyć animacją:

 Intent newUser = new Intent(getBaseContext(), NewUserActivity.class);
    startActivity(newUser);
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);

Aby zakończyć animacją:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_out_right,R.anim.slide_in_right);
}
Deivison Sporteman
źródło
12

Spójrz na zrobienie tego za pomocą tematu. Możesz zdefiniować animacje wejścia dla działań lub całej aplikacji

Nathan Schwermann
źródło
TAK! To było to. A więc, coś w tym stylu, tak. Zastosowałem już motyw, a motyw miał zdefiniowaną animację, dlatego nie mogłem uruchomić własnej animacji. Wielkie dzięki za wgląd!
b-ryce
3
czy możesz mi podpowiedzieć, gdzie szukać przejść, które zostaną dostarczone przez motywy. Chciałbym również ustawić niestandardowe przejście do wszystkich witryn, ale nie wiem jak.
LuckyMalaka
@Zapnologica ta inna odpowiedź, której udzieliłem na podobne pytanie, wyjaśnia to nieco bardziej. stackoverflow.com/questions/4940574/…
Nathan Schwermann
6

Idąc za odpowiedzią @schwiz, oto nadpisanie animacji dla wbudowanego motywu Dialog, w którym zdefiniowałem lokalne animacje slide_up i slide_down. Moja aktywność określa motyw MyDialog, aby umożliwić te przejścia.

<style name="Animation.MyDialog" parent="android:Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

<style name="Theme.MyDialog" parent="android:Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/Animation.MyDialog</item>
</style>

larham1
źródło
5

Użyj startActivityForResult, aby rozpocząć aktywność dziecka, a onActivityResult () aktywności nadrzędnej:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_YOUR_ACTIVITY) {
        overridePendingTransition(R.anim.parent_appearing_anim, R.anim.child_dissmissing_anim);
    }
    super.onActivityResult(requestCode, resultCode, arg2);
}
Chris.Zou
źródło
Działa to po naciśnięciu wstecz (fizyczny przycisk). Aby działał również ze strzałką „w górę”, zobacz tę odpowiedź: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- kliknięto / 20161352 # 20161352
lenooh
Ważna uwaga: overridePendingTransition musi zostać wywołane przed wywołaniem super.onActivityResult. W przeciwnym razie przejście pendinta nie zostanie nadpisane!
goemic