Как обеспечить анимацию при вызове другого действия в Android?

115

У меня есть два Activity A и B. Я хочу иметь сжатую анимацию, когда Activity A вызывает B, и максимизировать анимацию, когда Activity B вызывает A. Мне для этого не нужны файлы xml анимации.

Когда мы вызываем другое Activity в Android, оно дает анимацию по умолчанию, а затем вызывает анимацию сжатия.

Я хочу, чтобы анимация по умолчанию не появлялась, а появлялась нужная мне анимация.

Можем ли мы дать анимацию при вызове другого Activity?

Сунил
источник

Ответы:

144

Начиная с API 16, вы можете предоставлять пакет параметров активности при вызове Context.startActivity (Intent, Bundle) или связанных методов. Он создается с помощью конструктора 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метод Activities . Для входящей и исходящей анимации требуется два идентификатора ресурса. Идентификатор 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).

whlk
источник
4
Что вы имеете в виду, когда говорите «укажите собственную анимацию»? Как ты делаешь это? Спасибо!
pqn
У меня такой же вопрос. Возможно в анимации запуска в onResume и onPause.
Tima
можно ли вместо этого использовать Animator?
разработчик Android
Вы также можете использовать то же самое после вызова finish ()!
thiagolr
Разве R.anim.fade_inмы не предполагаем, что все еще есть анимация xml-файла res\anim ?
Alex Jolig
78

Для этого необходимо использовать метод OverridePendingTransition, который находится в классе Activity . Образцы анимации в папке res / anim примера apidemos. Проверь это. Более чем проверьте демонстрацию в ApiDemos / App / Activity / animation .

Пример:

@Override
public void onResume(){
    // TODO LC: preliminary support for views transitions
    this.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}
Praveen
источник
1
Спасибо за ответ. Метод overridePendingTransition поддерживается с уровня API 5, и я хочу, чтобы приложение поддерживалось с Android 1.5. Есть ли другой способ предоставить анимацию от одного действия к другому.
sunil
5
здорово! с этим очень весело играть
Someone Somewhere
@sunil у меня такая же проблема, как у вас. не могли бы вы решить проблему? анимация с api уровня 3 или 4 (не 5)
Доктор Джеки
сохранение кода анимации в onResume () вызовет воспроизведение анимации, когда пользователь выходит за пределы приложения и возвращается. Не идеален для многих приложений.
Vihaan Verma
Мне нужно было добавить super.onResume();, я получал: «android.util.SuperNotCalledException: Activity {com.abc.MyActivity} не вызывается на super.onResume ()»
Джин Бо
3

Jelly Bean добавляет поддержку для этого с помощью метода ActivityOptions.makeCustomAnimation () . Конечно, поскольку он есть только в Jelly Bean, для практических целей он практически бесполезен.

phreakhead
источник
5
Это больше не бесполезно :)
Грег Эннис
Используйте, ActivityOptionsCompatесли вы нацеливаетесь на pre-JellyBean.
Thuy Trinh