Як виконати затухаючу анімацію при переході на діяльність?


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>

Як я можу покращити цей код, щоб отримати лише ефект зникнення?

Відповіді:


236

Ви можете створити свої власні файли анімації .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
У нього неоціненний результат: overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);:)
AlvaroSantisteban

Чи повинен я використовувати overridePendingTransition onCreate або в кожному намірі? Або залежить від того, що я хочу? Дякую.
Рікардо

19
Є варіант без "перевизначення": Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd

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 не працює в деяких мобільних телефонах, а рішення Енеса не дуже приємне, ця відповідь повинна бути правильною.
Hugo Passos

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

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.