Как выполнить плавную анимацию при переходе активности?


89

Я кодифицирую эффект перехода между моей активностью с логотипом и моей основной деятельностью, но у меня есть проблема, что перед тем, как исчезнуть, активность переместится наверх:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>

</set>

Как я могу улучшить этот код, чтобы получить только эффект исчезновения?

Ответы:


237

Вы можете создать свои собственные файлы анимации .xml, чтобы они появлялись в новых Activityи постепенно уменьшались в текущих Activity:

fade_in.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" />

fade_out.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:fillAfter="true"
           android:duration="500" />

Используйте его в таком коде: (Внутри вашего Activity)

Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

Приведенный выше код исчезнет из текущего активного Activityи исчезнет из нового, что Activityприведет к плавному переходу.

ОБНОВЛЕНИЕ : @Dan J указал, что использование встроенной анимации Android улучшает производительность , что я действительно обнаружил после некоторого тестирования. Если вы предпочитаете работать со встроенной анимацией, используйте:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

Обратите внимание, что я ссылаюсь android.Rвместо Rдоступа к идентификатору ресурса.

ОБНОВЛЕНИЕ : сейчас обычной практикой является выполнение переходов с использованием класса Transition, представленного на уровне API 19 .


65
Использование встроенной анимации Android, похоже, приводит к более плавному переходу: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);просмотр этих файлов также может дать вам подсказки о том, как улучшить ваши пользовательские анимации (например, сделав постепенное появление дольше, чем исчезновение).
Dan J

41
В нем есть undescore overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban

Должен ли я использовать overridePendingTransition onCreate или в каждом намерении? Или зависит от того, что я хочу? Спасибо.
Ricardo

19
Есть вариант без "переопределения":Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
олейникд

1
Вышеупомянутый переход выполняется, только если он включен в параметрах разработчика, см. Stackoverflow.com/a/30422015/2914140 .
CoolMind

22

Просто повторно отправьте ответ oleynikd, потому что он простой и аккуратный

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);

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

19

вы также можете добавить анимацию в свою деятельность в методе onCreate, как показано ниже, потому что overridePendingTransition не работает с некоторыми мобильными устройствами или зависит от настроек устройства ...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);

1
Как обрабатывать анимацию для предыдущего или родительского действия?
Мехмед

9
Чтобы установить анимацию для перехода обратно к родительскому действию, используйте этот код: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
Джон Верко,

15

вы также можете использовать этот код в своем файле style.xml, поэтому вам не нужно ничего писать в своем activity.java

<!-- 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/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AppTheme.WindowTransition</item>
</style>

<!-- Setting window animation -->
<style name="AppTheme.WindowTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.