Отключить скользящую анимацию активности при запуске новой активности?

144

У меня есть действие, которое запускает другое действие нажатием кнопки. По умолчанию в более новых версиях ОС Android ОС будет анимировать новое действие, скользящее справа налево.

Есть ли способ отключить эту анимацию? Я просто хочу, чтобы новое действие появилось без какой-либо анимации.

user246114
источник

Ответы:

194

FLAG_ACTIVITY_NO_ANIMATIONФлаг работает отлично для отключения анимации при запуске деятельности.

Чтобы отключить аналогичную анимацию, которая запускается при вызове finish()Activity, то есть вместо этого анимация скользит справа налево, вы можете выполнить вызов overridePendingTransition(0, 0)после вызова, finish()и следующая анимация будет исключена.

Это также работает с анимацией, если вы звоните overridePendingTransition(0, 0)после вызова startActivity(...).

Маттиас
источник
9
Обратите внимание, что FLAG_ACTIVITY_NO_ANIMATIONи overridePendingTransitionявляются только API уровня 5+.
azdev 01
1
Это не помогает при возврате из действия при нажатии клавиши «Назад».
Яр
4
Вы самые лучшие. overridePendingTransition (0, 0) -> подобен богу. Он заменяет только анимацию finish (), но не анимацию, которая запускается при возобновлении предыдущего действия.
Филипп Яхода,
1
Мне не нравится этот ответ, потому что он не охватывает переходы, вызванные нажатием программных клавиш «назад». OP спрашивает, как «отключить» анимацию, а не «выборочно сказать приложению, чтобы оно не воспроизводило ее»
1owk3y
3
Если вы хотите отключить или переопределить также анимацию «назад», переопределите метод finish () в своем действии и поместите этот вызов вместе с вызовом super.finish (). Задача решена.
Гришка
175

ИМХО этот ответ здесь решает проблему самым элегантным способом ..

Разработчик должен создать стиль ,

<style name="noAnimTheme" parent="android:Theme">
  <item name="android:windowAnimationStyle">@null</item>
</style>

затем в манифесте установите его как тему для активности или всего приложения.

<activity android:name=".ui.ArticlesActivity" android:theme="@style/noAnimTheme">
</activity>

Вуаля! Легко и приятно..

PS кредиты оригинальному автору, пожалуйста

Эвоки
источник
1
Это не работает для Back, и это меняет внешний вид строки заголовка (делает ее маленькой) ...
Марек
Вы уверены, что не добавляли какие-то другие свойства в стиле, потому что никто больше не сообщил об этом "эффекте", о котором вы упомянули ..
Эвоки,
Просто для справки: это может вызвать проблему в иерархии представлений, где вам нужно requestWindowFeature ().
Мартин Маркончини
было бы неплохо, если бы вы немного уточнили, чтобы избежать возможных проблем
Ewoks
4
@Marek Я полагаю, ваша проблема заключается в неправильном изменении parent = "android: Theme". Вы должны изменить его на тему, которую хотите использовать, в основном этот код просто отключает конкретную анимацию в теме. например, используйте «Theme.AppCompat.Light.NoActionBar» вместо «android: Theme», и вы поймете, что я имею в виду. Я надеюсь, что это помогает.
Recomer
35

Применять

startActivity(new Intent(FirstActivity.this,SecondActivity.class));

тогда

overridePendingTransition(0, 0);

Это остановит анимацию.

Siddharth_Vyas
источник
30

На мой взгляд, лучший ответ - использовать "overridePendingTransition(0, 0);"

чтобы не видеть анимацию , если вы хотите Intentк Activityиспользованию:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);

и не видеть анимацию при нажатии кнопки возврата. onPauseМетод переопределения в вашемnewactivity

@Override
protected void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}
Саша
источник
19

Просто укажите Intent.FLAG_ACTIVITY_NO_ANIMATIONфлаг при запуске

Александр Косенков
источник
13

Это работает для меня при отключении анимации завершения активности.

@Override
protected void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}
cmcromance
источник
9

Я использую 4.4.2, и вызов overridePendingTransition (0, 0) в действии запуска onCreate () отключит начальную анимацию (вызов overridePendingTransition (0, 0) сразу после startActivity () НЕ работал). Как отмечено в другом ответе, вызов overridePendingTransition (0, 0) после finish () отключает анимацию закрытия.

Кстати, я обнаружил, что установка стиля с помощью "android: windowAnimationStyle"> @ null (другой ответ, упомянутый здесь) вызвала сбой, когда мое действие запуска попыталось установить заголовок панели действий. Продолжая отладку, я обнаружил, что это каким-то образом приводит к сбою window.hasFeature (Window.FEATURE_ACTION_BAR) в initActionBar () Activity.

Стив Б.
источник
1
как насчет onresume? единственная топовая деятельность и все такое.
Ласси Киннунен
7

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

Здесь работал вызов overridePendingTransition (0, 0); либо сразу после моего вызова startActivity (), либо onPause (). Оба способа работали, но выполнение их после startActivity () дает мне немного больше контроля над тем, когда мне нужна анимация, а когда нет.

Вуки
источник
2

У меня была аналогичная проблема с появлением черного экрана при скользящем переходе от одного действия к другому с использованием overridependingtransition. и я пошел по пути ниже, и это сработало

1) создал noanim.xmlв папке аним

<?xml version="1.0" encoding="utf-8"?>
<translate 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="0%p" />

и использовал

overridePendingTransition(R.drawable.lefttorightanim, R.anim.noanim);

Первый параметр в качестве моей исходной анимации и второй параметр, который является анимацией выхода в качестве фиктивной анимации.

Картика ПБ
источник
1

Для того , чтобы избежать черного фона при запуске активности уже в стеке, я добавил overridePendingTransition(0,0)в onStart():

@Override
protected void onStart() {
    overridePendingTransition(0,0);
    super.onStart();

}
Алекс Хуикулеску
источник