Подход с использованием новейшего API

Android выпустил официальную поддержку для отображения экрана-заставки.

Эта новая поддержка экрана-заставки добавлена ​​в Android 12, но ее можно использовать и в более ранних версиях Android с помощью библиотеки поддержки экрана-заставки.

Чтобы продемонстрировать различные аспекты API экрана-заставки, я создал пример приложения с помощью Jetpack Compose (окончательный предварительный просмотр экрана-заставки).

Давай начнем!

Шаг 1

Начнем с добавления заставки зависимость.

implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'

Шаг 2

Следующими шагами будет создание значка заставки и необязательного изображения бренда.

Позже мы обсудим, как создать значок заставки и сделать так, чтобы он отображался в центре экрана — в разделе Extras внизу экрана.

Шаг 3

Как только у нас будет готовый ресурс изображения, мы можем применить его, используя тему экрана-заставки.

<style name="Theme.Splash.Starting" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">
        @color/splash_screen_background
    </item>
    <item name="windowSplashScreenAnimatedIcon">
        @drawable/ic_splash_icon
    </item>
    <item name="windowSplashScreenAnimationDuration">
        @integer/splash_screen_animation_duration
    </item>
    <item name="postSplashScreenTheme">
        @style/Theme.App.NoActionBar
    </item>
    <!--Android 12 specific styles (put this in values-v31) -->
    <item name="android:windowSplashScreenBrandingImage">
        @drawable/ic_brand_icon
    </item>
    <!--Android 12 specific styles (put this in values-v31) -->
</style>

Давайте посмотрим на атрибуты стиля.

windowSplashScreenBackground — Как вы уже, наверное, догадались, это цвет фона, который будет занимать весь экран.

windowSplashScreenAnimatedIcon — Это может быть обычный векторный значок или анимированный векторный значок. Примечание. Анимированный векторный значок будет отображать анимацию только на устройствах Android 12+, более старые устройства API будут отображать только статический значок без анимации.

windowSplashScreenAnimationDuration — Продолжительность анимированной иконки. Рекомендуемая продолжительность составляет 1000 миллисекунд.

postSplashScreenTheme — Эта тема используется после загрузки приложения.
Это необходимо, потому что мы установим тему активности запуска как Theme.SplashScreen в манифесте приложения, что отлично подходит для отображения заставки, анимированного логотипа и значка бренда. . Однако, как только приложение будет загружено, мы получим исключение, если не используем Theme.AppCompat или Theme.MaterialComponents. Следовательно, этот атрибут приходит на помощь.

windowSplashScreenBrandingImage — изображение бренда для отображения нижней части экрана (доступно только с Android 12).

Шаг 4

Теперь установите тему активности запуска как Theme.Splash.Starting

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:theme="@style/Theme.Splash.Starting">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Шаг 5

И, наконец, внутри метода MainActivity onCreate добавьте installSplashScreen()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    installSplashScreen()

    setContent {
        AndroidSplashScreenTheme {
             Greeting("Android splash screen demo")
        }
    }
}

Другие особенности

Теперь, когда мы завершили настройку нашего нового экрана-заставки Android, теперь мы можем взглянуть на другие его функции.

Управляйте видимостью заставки.

API экрана-заставки поддерживает отображение экрана-заставки столько, сколько нам нужно.

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

installSplashScreen().setKeepVisibleCondition {
    mainViewModel.isScreenLoading.value
}

setKeepVisibleCondition

Этот метод принимает обратный вызов, который возвращает логическое значение, чтобы сказать, оставить ли экран включенным или нет. Значение true указывает, что экран-заставка должен оставаться как есть, а значение False указывает на удаление экрана-заставки.

SplashScreen API будет регулярно вызывать этот обратный вызов, чтобы проверить, следует ли сохранить экран-заставку или закрыть его.

Анимация содержимого экрана при закрытии экрана-заставки

installSplashScreen()
.setOnExitAnimationListener { splashScreenViewProvider ->
    // Animation code
}

Дополнительно

Давайте обсудим, как создать изображение заставки.

Как мы видим на значке заставки, section 1 замаскировано section 3.

Если мы применим нашу иконку как есть, она уменьшится и растянется.

Итак, как мы это исправим? Нам нужно создать иконку, соответствующую этому замаскированному отступу.

Допустим, у нас есть значок экрана-заставки размером 54x54, тогда мы создадим слой-оболочку размером 108x108 (удвоение реального значка) и поместим содержимое значка в его центр.

Пример

<?xml version="1.0" encoding="utf-8"?>
<vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="vector"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <!--Optional background spanning full 108x108 dp-->
    <path
        android:name="background"
        android:pathData="M 0 0 L 108 0 L 108 108 L 0 108 Z"
        android:fillColor="@color/splash_icon_background"
        android:strokeWidth="1"/>
   <!--Splash screen icon placed in the centre of the screen-->
    <group
        android:name="group_icon"
        android:pivotX="54"
        android:pivotY="54">
        <path
            android:name="path_pi"
            android:pathData="M 30 44.591 L......."
            android:fillColor="@color/splash_icon_color"
            android:strokeWidth="1"/>
    </group>
</vector>

Вот и все, ребята. Спасибо за прочтение.

Исходный код