Начиная с Android 12, API SplashScreen
позволяет запускать приложения с анимацией, включая движение в приложение при запуске, заставку, показывающую значок вашего приложения, и переход к самому приложению. SplashScreen
— это Window
и, следовательно, охватывает Activity
.
Заставка-экран привносит стандартные элементы дизайна в каждый запуск приложения, но ее также можно настраивать, чтобы ваше приложение могло сохранить свой уникальный фирменный стиль.
Помимо использования API платформы SplashScreen
, вы также можете использовать библиотеку совместимости SplashScreen
, которая является оболочкой для API SplashScreen
.
Как работает заставка
Когда пользователь запускает приложение, когда процесс приложения не запущен ( холодный запуск ) или когда Activity
не создано ( теплый запуск ), происходят следующие события:
Система отображает заставку, используя темы и любые анимации, которые вы определяете.
Когда приложение готово, заставка исчезает и отображается приложение.
При горячем запуске экран-заставка никогда не отображается.
Элементы и механика заставки
Элементы экрана-заставки определяются файлами ресурсов XML в файле манифеста Android. Для каждого элемента есть версии светлого и темного режима.
Настраиваемые элементы экрана-заставки состоят из значка приложения, фона значка и фона окна:

Рассмотрим следующие элементы, показанные на рисунке 2:
1 Значок приложения должен быть векторным. Он может быть статическим или анимированным. Хотя анимация может иметь неограниченную продолжительность, мы рекомендуем не превышать 1000 миллисекунд. Значок запуска используется по умолчанию.
2 Фон значка необязателен и полезен, если вам нужен больший контраст между значком и фоном окна. Если вы используете адаптивный значок , его фон отображается, если он достаточно контрастен с фоном окна.
3 Как и в случае с адаптивными значками, треть переднего плана маскируется.
4 Фон окна состоит из одного непрозрачного цвета. Если фон окна установлен и является простым цветом, он используется по умолчанию, если атрибут не установлен.
Размеры экрана-заставки
Значок заставки использует те же характеристики, что и адаптивные значки , а именно:
- Фирменное изображение: размер должен быть 200×80 dp.
- Значок приложения с фоном значка: должен быть размером 240×240 dp и вписываться в круг диаметром 160 dp.
- Значок приложения без фона значка: должен быть размером 288×288 dp и вписываться в круг диаметром 192 dp.
Например, если полный размер изображения составляет 300×300 dp, значок должен вписываться в круг диаметром 200 dp. Все, что находится за пределами круга, становится невидимым (маскируется).

Анимация заставки и последовательность запуска
Дополнительная задержка часто связана с запуском приложения при холодном старте. Добавление анимированного значка на заставку имеет очевидную эстетическую привлекательность и обеспечивает более премиальный опыт. Исследования пользователей показывают, что воспринимаемое время запуска меньше при просмотре анимации.
Анимация заставки встроена в компоненты последовательности запуска, как показано на рисунке 4.

Анимация входа: состоит из системного вида на заставку. Она управляется системой и не настраивается.
Заставка (показывается во время части "ожидания" последовательности): заставка может быть настроена, что позволяет вам предоставить собственную анимацию логотипа и брендинг. Для правильной работы она должна соответствовать требованиям, описанным на этой странице.
Анимация выхода: состоит из анимации, которая скрывает заставку. Если вы хотите настроить ее , используйте
SplashScreenView
и его значок. Вы можете запустить любую анимацию на них с настройками для преобразования, непрозрачности и цвета. В этом случае вручную удалите заставку, когда анимация будет завершена.
При запуске анимации значка запуск приложения дает вам возможность пропустить последовательность в случаях, когда приложение готово раньше. Приложение запускает onResume()
или заставка автоматически отключается, поэтому убедитесь, что движение можно легко пропустить. Заставку следует убирать с помощью onResume()
только тогда, когда приложение стабильно с визуальной точки зрения, поэтому дополнительные спиннеры не нужны. Представление незавершенного интерфейса может раздражать пользователей и может создать впечатление непредсказуемости или отсутствия полировки.
Требования к анимации заставки
Ваш экран-заставка должен соответствовать следующим характеристикам:
Установите один цвет фона окна без прозрачности. Дневной и ночной режимы поддерживаются библиотекой совместимости
SplashScreen
.Убедитесь, что анимированный значок соответствует следующим характеристикам:
- Формат: значок должен быть в формате AnimatedVectorDrawable (AVD) XML.
- Размеры: значок AVD должен быть в четыре раза больше адаптивного значка, как указано ниже:
- Площадь значка должна составлять 432 dp — другими словами, в четыре раза больше площади 108 dp немаскированного адаптивного значка.
- Внутренние две трети изображения видны на значке запуска и должны быть размером 288 dp — другими словами, в четыре раза больше 72 dp, которые составляют внутреннюю замаскированную область адаптивного значка.
- Продолжительность: мы рекомендуем не превышать 1000 мс на телефонах. Вы можете использовать отложенный старт, но он не может быть длиннее 166 мс. Если время запуска приложения больше 1000 мс, рассмотрите возможность использования циклической анимации.
Установите подходящее время для закрытия заставки, что происходит, когда ваше приложение рисует свой первый кадр. Вы можете дополнительно настроить это, как описано в разделе о сохранении заставки на экране в течение более длительного времени .
Ресурсы заставки
Загрузите пример стартового набора , который демонстрирует, как создавать, форматировать и экспортировать анимацию в AVD. Он включает в себя следующее:
- Файл проекта анимации Adobe After Effects.
- Окончательный экспортированный файл AVD XML.
- Пример GIF-анимации.
Загружая эти файлы, вы соглашаетесь с Условиями обслуживания Google .
Политика конфиденциальности Google описывает, как обрабатываются данные в этом сервисе.
Настройте заставку в своем приложении
По умолчанию SplashScreen
использует windowBackground
вашей темы, если windowBackground
— одноцветный. Чтобы настроить заставку, добавьте атрибуты в тему приложения.
Вы можете настроить заставку своего приложения, выполнив любое из следующих действий:
Задайте атрибуты темы, чтобы изменить ее внешний вид.
Оставьте его на экране на более длительный период.
Настройте анимацию закрытия заставки.
Начать
Основная библиотека SplashScreen
переносит заставку Android 12 на все устройства из API 23. Чтобы добавить ее в свой проект, добавьте следующий фрагмент в файл build.gradle
:
Круто
dependencies { implementation "androidx.core:core-splashscreen:1.0.0" }
Котлин
dependencies { implementation("androidx.core:core-splashscreen:1.0.0") }
Установите тему для экрана-заставки, чтобы изменить его внешний вид.
Вы можете указать следующие атрибуты в теме Activity
, чтобы настроить заставку для вашего приложения. Если у вас уже есть устаревшая реализация заставки, которая использует атрибуты, такие как android:windowBackground
, рассмотрите возможность предоставления альтернативного файла ресурсов для Android 12 и выше.
Используйте
windowSplashScreenBackground
, чтобы залить фон определенным цветом:<item name="android:windowSplashScreenBackground">@color/...</item>
Используйте
windowSplashScreenAnimatedIcon
для замены значка в центре стартового окна.Для приложений, ориентированных только на Android 12 (уровень API 32), выполните следующие действия:
Если объект анимируемый и рисуемый через
AnimationDrawable
иAnimatedVectorDrawable
, установитеwindowSplashScreenAnimationDuration
для воспроизведения анимации во время показа начального окна. Это не требуется для Android 13, поскольку длительность напрямую выводится изAnimatedVectorDrawable
.<item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>
Используйте
windowSplashScreenAnimationDuration
для указания продолжительности анимации значка заставки. Установка этого параметра не влияет на фактическое время, в течение которого отображается заставка, но вы можете получить его при настройке анимации выхода заставки с помощьюSplashScreenView.getIconAnimationDuration
. Подробнее см. в следующем разделе о сохранении заставки на экране в течение более длительного времени .<item name="android:windowSplashScreenAnimationDuration">1000</item>
Используйте
windowSplashScreenIconBackgroundColor
для установки фона за значком экрана-заставки. Это полезно, если между фоном окна и значком недостаточно контраста.<item name="android:windowSplashScreenIconBackgroundColor">@color/...</item>
Вы можете использовать
windowSplashScreenBrandingImage
для установки изображения, которое будет отображаться в нижней части экрана-заставки. Однако рекомендации по дизайну не рекомендуют использовать изображение бренда.<item name="android:windowSplashScreenBrandingImage">@drawable/...</item>
Вы можете использовать
windowSplashScreenBehavior
, чтобы указать, всегда ли ваше приложение отображает значок на заставке в Android 13 и выше. Значение по умолчанию — 0, что отображает значок на заставке, если запускающая активность устанавливаетsplashScreenStyle
вSPLASH_SCREEN_STYLE_ICON
, или следует поведению системы, если запускающая активность не указывает стиль. Если вы предпочитаете никогда не отображать пустой экран-заставку и всегда хотите, чтобы отображался анимированный значок, установите для этого значения значениеicon_preferred
.<item name="android:windowSplashScreenBehavior">icon_preferred</item>
Сохраняйте заставку на экране в течение более длительного времени
Заставка закрывается, как только приложение рисует свой первый кадр. Если вам нужно загрузить небольшой объем данных, например, асинхронно загрузить настройки приложения с локального диска, вы можете использовать ViewTreeObserver.OnPreDrawListener
, чтобы приостановить приложение для рисования своего первого кадра.
Если начальная активность завершается до отрисовки (например, если не задано представление содержимого и завершение до onResume
, прослушиватель pre-draw не нужен.
Котлин
// Create a new event for the activity. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Set the layout for the content view. setContentView(R.layout.main_activity) // Set up an OnPreDrawListener to the root view. val content: View = findViewById(android.R.id.content) content.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { // Check whether the initial data is ready. return if (viewModel.isReady) { // The content is ready. Start drawing. content.viewTreeObserver.removeOnPreDrawListener(this) true } else { // The content isn't ready. Suspend. false } } } ) }
Ява
// Create a new event for the activity. @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set the layout for the content view. setContentView(R.layout.main_activity); // Set up an OnPreDrawListener to the root view. final View content = findViewById(android.R.id.content); content.getViewTreeObserver().addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { // Check whether the initial data is ready. if (mViewModel.isReady()) { // The content is ready. Start drawing. content.getViewTreeObserver().removeOnPreDrawListener(this); return true; } else { // The content isn't ready. Suspend. return false; } } }); }
Настройте анимацию закрытия заставки
Вы можете дополнительно настроить анимацию заставки с помощью Activity.getSplashScreen()
.
Котлин
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... // Add a callback that's called when the splash screen is animating to the // app content. splashScreen.setOnExitAnimationListener { splashScreenView -> // Create your custom animation. val slideUp = ObjectAnimator.ofFloat( splashScreenView, View.TRANSLATION_Y, 0f, -splashScreenView.height.toFloat() ) slideUp.interpolator = AnticipateInterpolator() slideUp.duration = 200L // Call SplashScreenView.remove at the end of your custom animation. slideUp.doOnEnd { splashScreenView.remove() } // Run your animation. slideUp.start() } }
Ява
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... // Add a callback that's called when the splash screen is animating to the // app content. getSplashScreen().setOnExitAnimationListener(splashScreenView -> { final ObjectAnimator slideUp = ObjectAnimator.ofFloat( splashScreenView, View.TRANSLATION_Y, 0f, -splashScreenView.getHeight() ); slideUp.setInterpolator(new AnticipateInterpolator()); slideUp.setDuration(200L); // Call SplashScreenView.remove at the end of your custom animation. slideUp.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { splashScreenView.remove(); } }); // Run your animation. slideUp.start(); }); }
К началу этого обратного вызова запускается анимированный векторный элемент на заставке. В зависимости от продолжительности запуска приложения элемент может находиться в середине анимации. Используйте SplashScreenView.getIconAnimationStart
, чтобы узнать, когда началась анимация. Вы можете рассчитать оставшуюся продолжительность анимации значка следующим образом:
Котлин
// Get the duration of the animated vector drawable. val animationDuration = splashScreenView.iconAnimationDuration // Get the start time of the animation. val animationStart = splashScreenView.iconAnimationStart // Calculate the remaining duration of the animation. val remainingDuration = if (animationDuration != null && animationStart != null) { (animationDuration - Duration.between(animationStart, Instant.now())) .toMillis() .coerceAtLeast(0L) } else { 0L }
Ява
// Get the duration of the animated vector drawable. Duration animationDuration = splashScreenView.getIconAnimationDuration(); // Get the start time of the animation. Instant animationStart = splashScreenView.getIconAnimationStart(); // Calculate the remaining duration of the animation. long remainingDuration; if (animationDuration != null && animationStart != null) { remainingDuration = animationDuration.minus( Duration.between(animationStart, Instant.now()) ).toMillis(); remainingDuration = Math.max(remainingDuration, 0L); } else { remainingDuration = 0L; }
Дополнительные ресурсы
- Перенесите существующую реализацию заставки на Android 12 и выше.
- Теперь в приложении для Android , которое демонстрирует реальную реализацию экрана-заставки