Начиная с Android 12 API SplashScreen позволяет запускать приложения с анимацией, включая движение при запуске, заставку со значком приложения и переход к самому приложению. SplashScreen – это Window, поэтому он охватывает Activity.
Заставка содержит стандартные элементы дизайна, но ее можно настроить, чтобы сохранить уникальный брендинг приложения.
Помимо API платформы SplashScreen, вы также можете использовать библиотеку совместимости SplashScreen, которая является оболочкой для API SplashScreen.
Как работает заставка
Когда пользователь запускает приложение, процесс которого не выполняется (холодный запуск) или для которого не создано действие Activity (теплый запуск), происходят следующие события:
Система показывает заставку, используя темы и анимацию, которые вы задали.
Когда приложение готово, заставка исчезает и открывается приложение.
Заставка никогда не показывается при горячем запуске.
Элементы и механика заставки
Элементы заставки определяются XML-файлами ресурсов в файле манифеста Android. Для каждого элемента есть версии для светлой и тёмной темы.
Настраиваемые элементы заставки включают значок приложения, фон значка и фон окна.
Рассмотрим следующие элементы, показанные на рисунке 2:
1. Значок приложения должен быть объектом класса VectorDrawable. Оно может быть статичным или анимированным. Хотя продолжительность анимации может быть неограниченной, мы рекомендуем не превышать 1000 миллисекунд. По умолчанию используется значок приложения.
2 Фон значка необязателен. Он может пригодиться, если вам нужно сделать значок более заметным на фоне окна. Если вы используете адаптивный значок, его фон будет показываться, если он достаточно контрастирует с фоном окна.
3 Как и в случае с адаптивными значками, одна треть переднего плана маскируется.
4 Фон окна состоит из одного непрозрачного цвета. Если фон окна задан и является однотонным, он используется по умолчанию, если атрибут не задан.
Размеры заставки
Значок заставки должен соответствовать тем же требованиям, что и адаптивные значки:
- Образ бренда: 200 x 80 dp.
- Значок приложения с фоном. Он должен иметь размер 240 x 240 dp и помещаться в круг диаметром 160 dp.
- Значок приложения без фона. Он должен иметь размер 288 x 288 dp и помещаться в круг диаметром 192 dp.
Например, если полный размер изображения составляет 300 × 300 dp, значок должен помещаться в круг диаметром 200 dp. Все, что находится за пределами круга, становится невидимым (маскируется).
Анимация заставки и последовательность запуска
Дополнительная задержка часто связана с холодным запуском приложения. Анимированный значок на заставке выглядит привлекательно и делает приложение более премиальным. Изучение аудитории показывает, что при просмотре анимации время запуска кажется меньше.
Анимация заставки встроена в компоненты последовательности запуска, как показано на рисунке 4.
Анимация входа. Состоит из системного представления и заставки. Оно контролируется системой и не настраивается.
Заставка (показывается во время ожидания). Вы можете настроить заставку, добавив на нее собственный анимированный логотип и элементы бренда. Чтобы он работал правильно, он должен соответствовать требованиям, описанным на этой странице.
Анимация выхода. Скрывает заставку. Если вы хотите настроить его, используйте
SplashScreenViewи его значок. Вы можете запустить любую анимацию, настроив преобразование, прозрачность и цвет. В этом случае удалите заставку вручную, когда анимация закончится.
Если приложение готово к запуску раньше, чем завершится анимация значка, ее можно пропустить. Приложение запускает 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.0.0" }
Kotlin
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. В этом случае значок показывается на заставке, если для запускающего действия задано значениеSPLASH_SCREEN_STYLE_ICONатрибутаsplashScreenStyle. Если стиль не указан, значок показывается в соответствии с системными настройками. Если вы хотите, чтобы вместо пустой заставки всегда показывался анимированный значок, задайте значениеicon_preferred.<item name="android:windowSplashScreenBehavior">icon_preferred</item>
Увеличьте время показа заставки
Заставка исчезает, как только приложение отрисовывает первый кадр. Если вам нужно загрузить небольшой объем данных, например настройки приложения с локального диска, используйте ViewTreeObserver.OnPreDrawListener, чтобы приостановить приложение и отрисовать первый кадр.
Если начальное действие завершается до отрисовки, например если не задано представление контента и действие завершается до onResume, прослушиватель предварительной отрисовки не нужен.
Kotlin
// 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 } } } ) }
Java
// 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().
Kotlin
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() } }
Java
@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(); }); }
К началу этого обратного вызова запускается анимированный класс VectorDrawable на заставке. В зависимости от длительности запуска приложения, объект Drawable может находиться в середине анимации. Используйте SplashScreenView.getIconAnimationStart, чтобы узнать, когда началась анимация. Оставшуюся длительность анимации значка можно рассчитать следующим образом:
Kotlin
// 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 }
Java
// 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 и более поздние версии
- Приложение Now in Android, в котором показан пример реализации заставки.