Как добавить анимацию к активности finish ()

98

Я использую overridePendingTransition, когда создается мое действие, и оно отлично работает. Я вижу, что затухание отлично работает, но когда я пытаюсь анимировать завершение действия, он по-прежнему выполняет слайд справа налево по умолчанию.

Сначала я попытался определить анимацию выхода при запуске действия следующим образом:

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

Затем я попытался сделать это, когда закончу упражнение.

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

Но ни один из этих подходов не предотвратит скольжение «справа налево» для анимации выхода. Есть идеи о том, что я делаю неправильно?

Б-Райс
источник

Ответы:

228

Я отменяю отложенный переход сразу после вызова finish ();

В моем случае я сделал это, чтобы избежать переходов.

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

Порядок важен :)

Тупица
источник
5
автор "Details" @Goofyahead называет свое действие, в которое он входит, - ymmv. Этот метод помог мне заменить анимацию из Theme.Dialog на 2.x, но не на 3.x или 4.x
larham1
8
Как R.anim.nothingвыглядит?
sandalone
Используйте ответ @Felipe Micaroni Lalli, 0 означает отсутствие анимации.
Yeung
Мне это вроде тоже помогло. В нем объясняется, как определять свои собственные анимации: stackoverflow.com/questions/5151591/…
Адам
23
Вы можете переопределить finish()метод, чтобы избежать переходов во всех случаях (кнопка «Назад» нажата, как образец): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek 01
30

На этот вопрос уже был дан ответ, но самый эффективный способ добавить анимацию при выходе из действия - переопределить метод finish () соответствующего действия:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}
Бахадир Тасдемир
источник
24

Я бы предложил использовать метод isFinishing () для настройки анимации в onPause вместо вызова finish ()

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

}
Пабло А. Мартинес
источник
Почему так лучше?
Мануэль
19

Я исправил эту проблему, используя такой подход:

открыть с анимацией:

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

Чтобы закрыть с анимацией:

@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
источник
12

Попробуйте сделать это через тему. Вы можете определить анимацию входа и выхода для действий или всего приложения

Натан Шверманн
источник
ДА! Вот и все. Ну вроде. Я уже применил тему, и для темы была определена анимация, поэтому я не мог заставить работать свою собственную анимацию. Большое спасибо за понимание!
b-ryce 02
3
подскажете, где посмотреть какие переходы будут доставлены темами. Я также хотел бы установить индивидуальный переход для всех сайтов, но я не знаю как.
LuckyMalaka
@Zapnologica, этот другой ответ, который я дал на аналогичный вопрос, объясняет это немного больше. stackoverflow.com/questions/4940574/…
Натан Шверманн
6

Следуя ответу @schwiz, вот переопределение анимации для встроенной темы Dialog, в которой я определил локальные анимации slide_up и slide_down. Моя деятельность указывает тему MyDialog, чтобы эти переходы входили и выходили.

<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
источник
5

Используйте startActivityForResult, чтобы запустить дочернее действие, и в onActivityResult () родительского действия:

    @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
источник
Это работает при обратном нажатии (физическая кнопка). Чтобы он также работал со стрелкой «вверх», см. Этот ответ: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- щелкнул / 20161352 # 20161352
lenooh
Важно отметить: overridePendingTransition необходимо вызывать перед вызовом super.onActivityResult. В противном случае переход pendint не будет отменен!
goemic