Переход активности в Android

189

Как определить переход между двумя действиями для Android 1.5 и более поздних версий? Я хотел бы, чтобы активность исчезла.

hpique
источник
7
Относится ко всем overridePendingTransitionсвязанным ответам ниже: Вы можете пройти, (0, 0)если вообще не хотите анимации.
Dokkaebi

Ответы:

164

Вы можете сделать это с Activity.overridePendingTransition(). Вы можете определить простые анимации перехода в файле ресурсов XML.

iandisme
источник
Спасибо иандизм. overridePengingTransition - уровень API 5. Разве нельзя сделать это для уровня 3 (Android 1.5)?
hpique
Ах, ты прав. Ответ CaseyB, вероятно, больше соответствует тому, что вы ищете.
иандизм
Еще не нашли, как сделать правильный ответ с ответом CaseyB.
hpique
1
Вы можете сделать это в функции вашей деятельности onCreate.
mxcl
1
В HTC вы должны изменить настройки> дисплей> анимация, чтобы все работало (или хотя бы в HTC Desire HD).
Urboss
192

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

Создайте файл с именем fadein.xmlвres/anim

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="2000" />

Создайте файл с именем fadeout.xmlвres/anim

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />

Если вы хотите , чтобы исчезнуть из активности А на активность B , поместите следующее в onCreate()методе активности B . До setContentView()меня работает.

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

Если замирания слишком медленные для вас, измените android:durationприведенные выше xml-файлы на что-то меньшее.

Бен Клейтон
источник
54
Просто чтобы добавить к этому. overridePendingTransition () необходимо будет вызвать снова, сразу после того, как ОС решит закрыть вашу активность. Я просто поместил другой идентичный вызов overridePendingTransition (fadein, fadeout) в методе Activity действия onPause (). В противном случае вы увидите, что активность исчезнет, ​​но не исчезнет при закрытии.
Nate
2
Нет ответов в другой теме. Я удаляю это. Что я испытываю, так это то, что происходит, когда переход происходит немедленно, а затем он гаснет и исчезает. Поэтому я нахожусь в действии A, и отображается действие B, затем тускнеет и исчезает. Затем я изменил его, следуя инструкциям с добавив код в onPause () Деятельности A и получи такое же поведение.
Geeks On Hugs
12
Использование встроенной анимации Android, по-видимому, приводит к более плавному переходу: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); просмотр этих файлов может также дать вам подсказки о том, как улучшить ваши собственные анимации (например, сделать затухание более продолжительным, чем затухание).
Дан Джей
3
Просто не забывай менять fadeinи fadeoutна fade_inи fade_out. Из поста Дэна Дж.
Фарид
2
Согласно документам, вам следует звонить overridePendingTransition()сразу после звонка finish()и / или startActivity(). Я смог добиться хорошего затухания таким образом, вызвав его сразу после запуска нового Activity.
Ионокласт Бригам
50

Даже простой способ сделать это:

  1. Создайте стиль анимации в своем файле styles.xml
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. Добавьте этот стиль в тему вашего приложения
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Это оно :)

Фелипе Конде
источник
31

Да. Вы можете указать ОС, какой переход вы хотите сделать для своей деятельности.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

Где ANIMATION - это целое число, относящееся к встроенной анимации в ОС.

CaseyB
источник
Должен ли я сделать что-то еще, чтобы это работало? getWindow (). setWindowAnimations (android.R.anim.fade_in) не приводит к принудительному переходу, который использовался по умолчанию, но это также не переход с постепенным исчезновением. Новое действие появляется поверх предыдущего на устройстве Nexus One.
hpique
1
Это потому, что это не запрос ресурса, а запрос идентификатора анимации перехода, встроенной в ОС. developer.android.com/intl/fr/reference/android/view/…
CaseyB
4
Кажется, setWindowAnimations принимает только ресурсы стиля. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) является наиболее близким к исчезновению, но он исчезает из черного, а не из предыдущего действия.
hpique
1
Он не должен быть встроен в анимацию в ОС, вы можете определить пользовательский в значениях.
ilija139
1
@ ilija139, ты уверен? Здесь сказано : developer.android.com/reference/android/view/… «Это должен быть системный ресурс; он не может быть ресурсом приложения, поскольку у оконного менеджера нет доступа к приложениям».
ляпис
29

создать res> anim> fadein.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" />

создать res> anim> fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />

В res> значения> styles.xml

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

В деятельности по созданию ()

getWindow().getAttributes().windowAnimations = R.style.Fade;
IceSteve
источник
2
Я бы предложил добавить его в тему, чтобы он применялся ко всем действиям?
Peterdk
12
Эти анимации уже определены в Android, просто добавьте следующий код в onPause () всех действий:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava
Да, просто хотелось показать, что анимацию можно редактировать по вкусу разработчиков.
IceSteve 26.12.12
29

Список анимаций по умолчанию смотрите: адресу http://developer.android.com/reference/android/R.anim.html.

Есть на самом деле fade_inи fade_outдля API уровня 1 и выше.

Кевин К. Кринке
источник
2
например, getWindow (). setWindowAnimations (android.R.anim.slide_in_left);
Пьер
5
Приветствия, я потратил удивительно много времени, чтобы найти их.
georgiecasey
26

Я перезаписываю анимацию активности по умолчанию. Я проверяю это в API 15, что он работает гладко. Вот решение, которое я использую:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Создайте папку anim в папке res, а затем создайте следующие четыре файла анимации:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="-100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Вы можете скачать мой пример проекта .

Вот и все... :)

Шохан Ахмед Сиян
источник
Это должен быть принятый ответ. Работает хорошо!
EdgeDev
24

Вот код, чтобы сделать приятное сглаживание между двумя действиями.

  1. плавный эффект слева направо

    Создайте файл с именем slide_in_right.xml и slide_out_right.xml в res / anim

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. плавный эффект справа налево

    Создайте файл с названием animation_enter.xml и animation_leave.xml в res / anim

    animation_enter.xml

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700"/>
       </set>

    animation_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. Переход от одного занятия ко второму.

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4. При обратном нажатии на событие или переход от второго занятия к одному.

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();
Сачин Пангаре
источник
3
ПереопределениеPendingTransition должно быть после startActivity в 3.
arberg
ПереопределениеPendingTransition должно быть после startActivity в 3 и 4
Tareq
Это не работает для меня, если overridePendingTransition () поставить перед startActivity ()
Фернандо Тан
Должен позвонить overridePendingTransitionсразу после запуска. Активность: developer.android.com/reference/android/app/…
Midhun MP
4

Вы не можете использовать overridePendingTransition в Android 1.5. overridePendingTransistion вышла на Android 2.0.

Если вы собираетесь пройти через это без каких-либо ошибок, вы должны скомпилировать для цели (1.5 или выше), используя обычные анимации (или свои собственные), или вам нужно скомпилировать для цели (2.0 или выше), используя overridePendingTransistion.

Описание: Вы не можете использовать overridePendingTransistion в Android 1.5 .

Вы можете использовать встроенную анимацию в ОС.

Штора
источник
Это не правильно. Анимации есть в Android до 1.6, и вы можете использовать overridePendingTransistion с отражением, чтобы по-прежнему нацеливаться на 1.5.
hpique
Ну, моя ошибка. Обновил мой пост. Вы, безусловно, можете создавать свои собственные анимации и настраивать их так, как вы хотите в 1.5. Но вы все равно не можете использовать overridePendingTransition, поскольку он начал появляться на уровне API 5.
Занавес
2

В GALAXY Устройства:

Вы должны убедиться, что вы не выключили его на устройстве, используя Настройки> Параметры разработчика:

две куклы

Махер Исмаил
источник
даже для устройств LG :)
Ultimo_m
Я так думаю, но я не пробую
Maher Ismaail
Фантастика! Я нашел ваш ответ после нескольких часов поиска переходов и анимации.
CoolMind
1

Используйте ActivityCompat.startActivity () работает API> 21.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());
Мухаммед Амир Али
источник
1

Перед началом вашего намерения:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

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

devDeejay
источник
0

Некоторые версии Android поддерживают пользовательские Activityпереходы, а некоторые нет (более старые устройства). Если вы хотите использовать пользовательские переходы, рекомендуется проверить, Activityимеет лиoverridePendingTransition() метода метод, в отличие от более старых версий.

Чтобы узнать, существует ли метод или нет, можно использовать API отражения. Вот простой код, который проверит и вернет метод, если он существует:

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

И тогда мы можем применить наш собственный переход, т.е. использовать этот метод, если он существует:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

Здесь, например, для демонстрации перехода использовались простые анимации постепенного появления и исчезновения.

Серж Ардович
источник
0

уменьшить анимацию

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0" android:toAlpha="1.0"
    android:duration="500" />

zoom_exit

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0"
    android:fillAfter="true"
    android:duration="500" />

источник