Як додати анімацію до завершення діяльності ()


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();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

Порядок важливий :)


5
за "Деталі", @Goofyahead називає свою додаючу діяльність - ymmv. Ця методика працювала для мене, щоб замінити анімацію з Theme.Dialog на 2.x, але не 3.x або 4.x
larham1

8
Як це R.anim.nothingвиглядає?
сандалон

Використовуйте @Felipe Micaroni Lalli відповідь, 0 означає відсутність анімації.
Yeung

Це як допомогло і мені. Він пояснює, як визначити власну анімацію: stackoverflow.com/questions/5151591/…
Адам,

23
Ви можете змінити finish()метод, щоб уникнути переходів у всіх випадках (натиснута кнопка "назад", як зразок): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek

29

На це питання вже відповіли, але найефективнішим способом розміщення анімації під час виходу з активності є переосмислення методу "закінчення ()" відповідної діяльності:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}

24

Я б запропонував використовувати метод isFinishing () для налаштування анімації в onPause замість виклику закінчення ()

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

12

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


ТАК! Це було все. Добре начебто. Я вже застосував тему, і в цій темі була визначена анімація, тому я не міг змусити власну анімацію працювати. Дякую тонну за розуміння!
б-рице

3
чи можете ви дати мені підказку, де шукати, які транзити будуть здійснені за темами. Я також хотів би встановити спеціальний перехід на всі сайти, але я не знаю як.
LuckyMalaka

@Zapnologica це інша відповідь, яку я дав на аналогічне запитання, це промовляє трохи більше. stackoverflow.com/questions/4940574 / ...
Натан Schwermann

6

Після відповіді на @schwiz, ось перегляд анімації для вбудованої теми діалогу, де я визначив локальну анімацію 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>


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

Це працює при натисканні назад (фізична кнопка). Щоб він також працював зі стрілкою вгору, дивіться цю відповідь: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- натиснув / 20161352 # 20161352
lenooh

Важливо зазначити: overridePendingTransition потрібно викликати перед викликом super.onActivityResult. Інакше перехід маятника не буде перекрито!
геміка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.