Начиная с Android 12, приложения запускаются с системной заставкой, которая включает анимацию при запуске, заставку со значком приложения и переход к самому приложению. Заставка – это Window, поэтому она закрывает Activity.
Заставка содержит стандартные элементы дизайна, но ее можно настроить, чтобы сохранить уникальный брендинг приложения.
Чтобы настроить заставку в приложении, используйте библиотеку совместимости Jetpack SplashScreen. Она включает API SplashScreen и работает с любыми ComponentActivity, в том числе с теми, которые настраивают интерфейс с помощью Compose и setContent.
Как работает заставка
Когда пользователь запускает приложение, процесс которого не выполняется (холодный запуск) или для которого не создан объект Activity (теплый запуск), происходят следующие события:
Система показывает заставку, используя темы и анимацию, которые вы задали.
Когда приложение готово, заставка исчезает и открывается приложение.
Заставка никогда не показывается при горячем запуске.
Элементы и механика заставки
Элементы заставки определяются файлами ресурсов XML в файле манифеста Android. Для каждого элемента есть версии для светлой и тёмной темы.
Настраиваемые элементы заставки включают значок приложения, фон значка и фон окна.
Рассмотрим следующие элементы, показанные на рисунке 2:
1. Значок приложения должен быть объектом класса VectorDrawable. Оно может быть статичным или анимированным. Хотя продолжительность анимации может быть неограниченной, мы рекомендуем не превышать 1000 миллисекунд. По умолчанию используется значок приложения.
2 Фон значка необязателен. Он может пригодиться, если вам нужно сделать значок более заметным на фоне окна. Если вы используете адаптивный значок, его фон будет показываться, если он достаточно контрастирует с фоном окна.
3 Как и в случае с адаптивными значками, одна треть переднего плана маскируется.
4 Фон окна состоит из одного непрозрачного цвета. Если фон окна задан и является однотонным, он используется по умолчанию, если атрибут не задан.
Размеры заставки
Значок заставки должен соответствовать тем же требованиям, что и адаптивные значки:
- Образ бренда: 200 x 80 dp.
- Значок приложения с фоном: размер 240 × 240 dp, должен помещаться в круг диаметром 160 dp.
- Значок приложения без фона. Он должен иметь размер 288 x 288 dp и помещаться в круг диаметром 192 dp.
Например, если полный размер изображения составляет 300 × 300 dp, значок должен помещаться в круг диаметром 200 dp. Все, что находится за пределами круга, становится невидимым (маскируется).
Анимация заставки и последовательность запуска
Дополнительная задержка часто связана с холодным запуском приложения. Анимированный значок на заставке выглядит привлекательно и производит хорошее впечатление. Изучение аудитории показывает, что при просмотре анимации время запуска кажется меньше.
Анимация заставки встроена в компоненты последовательности запуска, как показано на рисунке 4.
Анимация входа. Состоит из системного представления и заставки. Оно контролируется системой и не настраивается.
Заставка (показывается во время ожидания). Вы можете настроить заставку, добавив на нее собственный анимированный логотип и элементы бренда. Чтобы он работал правильно, он должен соответствовать требованиям, описанным на этой странице.
Анимация выхода. Скрывает заставку. Если вы хотите настроить его, используйте представление
SplashScreenViewProviderи его значок. Вы можете запустить любую анимацию, настроив преобразование, прозрачность и цвет. В этом случае удалите заставку вручную, когда анимация завершится.
Если приложение готово к запуску раньше, чем закончится анимация значка, ее можно пропустить. Приложение запускает onResume() или заставка закрывается автоматически, поэтому убедитесь, что анимацию можно легко пропустить. Заставка должна закрываться с помощью onResume(), только когда приложение стабильно с визуальной точки зрения, поэтому дополнительные индикаторы загрузки не нужны. Неполный интерфейс может раздражать пользователей и создавать впечатление непредсказуемости или недоработанности.
Требования к анимации заставки
Заставка должна соответствовать следующим требованиям:
Задайте один цвет фона окна без прозрачности. Дневной и ночной режимы поддерживаются в библиотеке совместимости
SplashScreen.Убедитесь, что анимированный значок соответствует следующим требованиям:
- Формат. Значок должен быть в формате XML AnimatedVectorDrawable (AVD).
- Размеры. Значок AVD должен быть в четыре раза больше адаптивного значка:
- Область значка должна быть 432 dp, то есть в четыре раза больше, чем область незамаскированного адаптивного значка (108 dp).
- Внутренние две трети изображения видны на значке приложения и должны иметь размер 288 dp, то есть в четыре раза больше, чем 72 dp, которые составляют внутреннюю маскированную область адаптивного значка.
- Продолжительность. На телефонах рекомендуется не превышать 1000 мс. Вы можете использовать отложенный запуск, но он не должен превышать 166 мс. Если запуск приложения занимает больше 1000 мс, рекомендуем использовать зацикленную анимацию.
Определите подходящее время для закрытия заставки, которое происходит, когда приложение отрисовывает свой первый кадр. Вы можете настроить заставку так, чтобы она оставалась на экране дольше.
Ресурсы заставки
Скачайте пример набора для начинающих, в котором показано, как создавать, форматировать и экспортировать анимацию в AVD. В него входят:
- Файл проекта Adobe After Effects с анимацией.
- Окончательный экспортированный XML-файл AVD.
- Пример GIF-анимации.
Скачивая эти файлы, вы принимаете Условия использования Google.
Правила обработки данных описаны в Политике конфиденциальности Google.
Как настроить заставку в приложении
По умолчанию SplashScreen использует windowBackground вашей темы, если windowBackground – один цвет. Чтобы настроить заставку, добавьте атрибуты в тему приложения.
Вы можете настроить заставку приложения, выполнив любое из следующих действий:
Задайте атрибуты темы, чтобы изменить ее внешний вид.
Увеличьте время показа.
Настройте анимацию для закрытия заставки.
Начать
Основная библиотека SplashScreen позволяет использовать заставку Android 12 на всех устройствах с API 23 и более поздними версиями. Чтобы добавить его в проект, добавьте следующий фрагмент в файл build.gradle:
Яркий
dependencies { implementation "androidx.core:core-splashscreen:1.2.0" }
Kotlin
dependencies { implementation("androidx.core:core-splashscreen:1.2.0") }
Затем создайте тему заставки, которая наследует от Theme.SplashScreen, задайте postSplashScreenTheme для темы, которую объект Activity использует после этого, примените тему заставки в манифесте (см. раздел Перенос существующей реализации заставки на Android 12) и вызовите installSplashScreen() в начальном объекте Activity перед вызовом super.onCreate(), как показано в примерах в следующих разделах.
Задайте тему для заставки, чтобы изменить ее внешний вид.
Чтобы настроить заставку для приложения, вы можете указать в теме 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, чтобы указать продолжительность анимации значка на заставке. Это не влияет на фактическое время показа заставки, но вы можете получить его при настройке анимации выхода из заставки с помощьюSplashScreenViewProvider.iconAnimationDurationMillis. Подробнее о том, как увеличить время показа заставки…<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>
Увеличьте время показа заставки
Заставка исчезает, как только приложение отрисовывает первый кадр. Если вам нужно загрузить небольшой объем данных, например асинхронно загрузить настройки приложения с локального диска, используйте setKeepOnScreenCondition, чтобы заставка оставалась на экране до тех пор, пока данные не будут готовы. Условие оценивается перед отрисовкой каждого кадра, поэтому оно должно быть быстрым, чтобы не блокировать пользовательский интерфейс.
Если начальное действие завершается до отрисовки (например, если не задано представление контента и действие завершается до onResume), условие задавать не нужно.
override fun onCreate(savedInstanceState: Bundle?) { // Install the splash screen before calling super.onCreate(). val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // Keep the splash screen on-screen until the initial data is ready. // The condition is checked each time the app is about to draw a frame. splashScreen.setKeepOnScreenCondition { !viewModel.isReady.value } setContent { MyApp() } }
Настройте анимацию для закрытия заставки
Вы можете настроить анимацию заставки с помощью setOnExitAnimationListener. Прослушиватель получает объект SplashScreenViewProvider, который позволяет анимировать заставку. Вызовите remove(), когда анимация закончится.
override fun onCreate(savedInstanceState: Bundle?) { val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // Add a callback that's called when the splash screen is animating to the // app content. splashScreen.setOnExitAnimationListener { splashScreenViewProvider -> val splashScreenView = splashScreenViewProvider.view // Create your custom animation. val slideUp = ObjectAnimator.ofFloat( splashScreenView, View.TRANSLATION_Y, 0f, -splashScreenView.height.toFloat() ) slideUp.interpolator = AnticipateInterpolator() slideUp.duration = 200L // Call SplashScreenViewProvider.remove at the end of your custom // animation. slideUp.doOnEnd { splashScreenViewProvider.remove() } // Run your animation. slideUp.start() } setContent { MyApp() } }
К началу этого обратного вызова запускается анимированный класс VectorDrawable на заставке. В зависимости от длительности запуска приложения объект Drawable может находиться в середине анимации. Используйте SplashScreenViewProvider.iconAnimationStartMillis, чтобы узнать, когда началась анимация. Оставшуюся продолжительность анимации значка можно рассчитать следующим образом:
// Get the duration of the animated vector drawable. val animationDuration = splashScreenViewProvider.iconAnimationDurationMillis // Get the start time of the animation, in milliseconds since the epoch. val animationStart = splashScreenViewProvider.iconAnimationStartMillis // Calculate the remaining duration of the animation. val remainingDuration = (animationDuration - (System.currentTimeMillis() - animationStart)) .coerceAtLeast(0L)
Дополнительные ресурсы
- Как перенести заставку на Android 12 и более поздние версии
- Приложение Now in Android, в котором показана реализация заставки.