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


188

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


7
Застосовується до всіх overridePendingTransitionпов'язаних відповідей нижче: Ви можете передавати, (0, 0)якщо взагалі немає анімації.
dokkaebi

Відповіді:


164

Ви можете це зробити за допомогою Activity.overridePendingTransition(). Ви можете визначити просту анімацію переходу у файлі ресурсів XML.


Дякую iandisme. overridePengingTransition - рівень API 5. Неможливо це зробити для рівня 3 (Android 1.5)?
hpique

Ах, ти маєш рацію. Відповідь CaseyB, ймовірно, більше відповідає тому, що ви шукаєте.
iandisme

Ще не знайшли, як зробити належну проблему з відповіді CaseyB.
hpique

1
Це можна зробити у своїй діяльності onCreate.
mxcl

1
У HTC вам потрібно змінити налаштування> дисплей> анімацію, щоб усі вони працювали (або принаймні на HTC Desire HD).
Урбос

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) у методі onPause () діяльності. В іншому випадку ви побачите, що активність затухає, але не закривається, коли закривається.
Нейт

2
Немає відповідей на іншій темі. Я його видаляю. Я переживаю те, що відбувається - це перехід відбувається негайно, а потім темніє і згасає. Отже, я перебуваю на Активісті А, а активність B відображається, потім тьмяніє і згасає. Потім я змінив її, щоб слідувати інструкціям додавання коду до onPause () діяльності A і отримувати таку саму поведінку.
Geeks On Hugs

12
Використання вбудованої в Android анімації, схоже, призводить до плавнішого переходу: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); перегляд цих файлів також може дати вам підказки, як покращити власну анімаційну анімацію (наприклад, зробивши зникнення останнім довше, ніж зникнення).
Dan J

3
Просто не забудьте змінити fadeinі fadeoutдо fade_inі fade_out. З поста Дана Дж.
Фарид

2
Згідно з документами, вам слід зателефонувати overridePendingTransition()відразу після дзвінка finish()та / або startActivity(). Мені вдалося отримати приємне вицвітання таким чином, зателефонувавши йому відразу після запуску нової діяльності.
Іонокласт Брігхем

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

    ...

}

Де АНІМАЦІЯ - це ціле число, що відноситься до вбудованої анімації в ОС.


Чи потрібно робити щось інше, щоб воно працювало? 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/… : "Це повинен бути системний ресурс; він не може бути ресурсом програми, оскільки менеджер вікон не має доступу до програм."
lapis

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>

У заходах onCreate ()

getWindow().getAttributes().windowAnimations = R.style.Fade;

2
Я б запропонував додати його до теми, щоб він застосовувався до всіх видів діяльності?
Peterdk

12
Ці анімації вже визначені в Android, просто додайте наступний код у програмі onPause () усіх видів діяльності:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

Так, просто хотілося показати, що анімацію можна редагувати на свій смак розробникам.
IceSteve

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

25

Я перезаписую свою анімацію за умовчанням Я тестую в 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>

Створіть папку анімації в папці 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
OverridePendingTransition має бути після запускуАктивності в 3.
arberg

OverridePendingTransition має бути після запускуАктивності в 3 та 4
Tareq

Для мене це не працює, якщо overridePendingTransition () поставити перед startActivity ()
Фернандо Тан

Слід зателефонувати overridePendingTransitionодразу після запускуActivity: 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, оскільки він почав з’являтися на рівні 5 API
Curtain

2

У пристроях GALAXY:

Потрібно переконатися, що ви не вимкнули його на пристрої, використовуючи Налаштування> Параметри розробника:

дві лялечки


навіть для пристроїв LG :)
Ultimo_m

Я думаю, що так, але я не намагаюся це зробити
Maher Ismaail

Фантастичний! Я знайшов вашу відповідь через кілька годин пошуку переходів та анімації.
CoolMind

1

Використовуйте API ActivityCompat.startActivity () працює> 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());

Це дає анімацію за замовчуванням для вашої активності переходу.


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" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.