Як забезпечити анімацію під час виклику іншої діяльності в Android?


115

У мене є дві дії A і B. Я хочу мати анімацію, що зменшується, коли активність A викликає B і максимізує анімацію, коли активність B викликає А. Мені для цього не потрібні файли xml-анімації.

Коли ми називаємо іншу діяльність в Android, вона надає анімацію за замовчуванням, а потім викликає анімацію скорочення.

Що я хочу, це те, що анімація за замовчуванням не повинна відбуватися, а анімація, яку я хочу, повинна відбуватися.

Чи можемо ми насправді дати анімацію під час виклику іншої діяльності?

Відповіді:


144

Оскільки API 16, ви можете надати пакет параметрів активності при виклику Context.startActivity (Намір, Пакет) або пов'язаних з ними методів. Він створюється за допомогою конструктора ActivityOptions :

Intent myIntent = new Intent(context, MyActivity.class);
ActivityOptions options = 
   ActivityOptions.makeCustomAnimation(context, R.anim.fade_in, R.anim.fade_out);
context.startActivity(myIntent, options.toBundle());

Не забудьте перевірити інші методи конструктора ActivityOptions та ActivityOptionsCompat, якщо ви використовуєте бібліотеку підтримки.



API 5+:

Для програм, орієнтованих на API рівня 5+, існує overridePendingTransitionметод " Діяльність" . Для отримання вхідної та вихідної анімації потрібно два ідентифікатори ресурсу. Ідентифікатор 0відключить анімацію. Телефонуйте це відразу після startActivityдзвінка.

тобто:

startActivity(new Intent(this, MyActivity.class));
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

API 3+:

Ви можете запобігти анімації за замовчуванням (просуньте праворуч) Intent.FLAG_ACTIVITY_NO_ANIMATIONпрапором у своєму намірі.

тобто:

Intent myIntent = new Intent(context, MyActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(myIntent);

то у своїй діяльності просто потрібно вказати власну анімацію.

Це також працює для API 1.5 (рівень 3).


4
Що ви маєте на увазі, коли говорите "вкажіть власну анімацію"? Як це зробити? Дякую!
pqn

У мене те саме питання. Можливо, в запуску анімації в onResume і onPause.
Тіма

чи є натомість використовувати Animator?
андроїд розробник

Ви можете також використовувати те ж саме після виклику закінчення ()!
tiagolr

Це R.anim.fade_inще не анімація файлів XML, яку ми, напевно, маємо мати res\anim ?
Алекс Джоліг

78

Для його досягнення ви повинні використовувати метод OverridePendingTransition, який знаходиться в класі активності . Зразкові анімації у папці res / anim приклад прикладу apidemos. Перевір це. Більше, ніж перевірити демонстрацію в ApiDemos / App / Активність / Анімація .

Приклад:

@Override
public void onResume(){
    // TODO LC: preliminary support for views transitions
    this.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}

1
Дякую за відповідь. Метод overridePendingTransition підтримується на рівні 5 API, і я хочу, щоб програма підтримувалась на Android 1.5. Чи є інший спосіб надання анімації від однієї діяльності до іншої.
суніль

5
приголомшливий! з цим дуже весело грати
Хтось Десь

@sunil У мене такі ж запитання, як у вашої. Чи могли б ви вирішити проблему? анімація з api 3 або 4 рівня (не 5)
Dr.jacky

збереження анімаційного коду в onResume () призведе до відтворення анімації, коли користувач вийде за межі програми та повернеться назад. Не ідеально для багатьох додатків.
Vihaan Verma

Мені потрібно було додати super.onResume();, отримував: "android.util.SuperNotCalledException: Діяльність {com.abc.MyActivity} не зателефонувала до super.onResume ()"
Gene Bo


3

Jelly Bean додає підтримку для цього методом ActivityOptions.makeCustomAnimation () . Звичайно, оскільки це лише на Jelly Bean, це практично нічого не вартує для практичних цілей.


5
Це вже нічого не варто :)
Грег Енніс

Використовуйте, ActivityOptionsCompatякщо ви орієнтуєтесь на попередньо JellyBean.
Чт Трінь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.