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?

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


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);
}

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);
    }

}

Dlaczego tak jest lepiej?
Manuel


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);
}

12

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


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>


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);
}

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