API экрана-заставки из Android

В магазине Play есть миллиарды приложений для Android. У большинства приложений есть одна общая черта — экран-заставка. Android 12 принес нам официальную поддержку заставки. Раньше нам приходилось добавлять кастомную реализацию, т.е. не было единого способа ее реализовать. Вы также можете реализовать эту функцию в более ранних версиях (минимум SDK 23) с библиотекой поддержки.

Определение заставки

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

Пример анимации заставки из официального документа Android:

Экран-заставка будет отображаться в следующих случаях:

  1. Холодный старт — холодный старт означает запуск приложения с нуля. Холодный запуск происходит в таких случаях, когда ваше приложение запускается впервые с момента загрузки устройства или система уничтожила приложение.
  2. Теплый запуск происходит, когда пользователь отказывается от приложения или когда система удаляет ваше приложение из памяти, а затем пользователь повторно запускает приложение.

Реализация API заставки

Давайте вместе покодим.

Шаг 1:

Добавьте следующую зависимость gradle в файл уровня приложения build.gradle:

implementation "androidx.core:core-splashscreen:1.0.0-beta01"

Убедитесь, что compileSdkVersion вашего приложения 31 или выше.

Теперь синхронизируйте gradle.

Шаг 2:

Создайте заставку в values/themes.xml. Кроме того, это аналог ночного режима, если вы поддерживаете ночной режим, то есть в values-night/themes.xml. Заставка будет выглядеть следующим образом:

<style name="Theme.MySplash" parent="Theme.SplashScreen">
        <item name="windowSplashScreenBackground">@color/purple_500</item>
        <item name="windowSplashScreenAnimatedIcon">@drawable/splash_animation</item>
        <item name="postSplashScreenTheme">@style/AppTheme</item>
        <item name="windowSplashScreenAnimationDuration">2000</item>
    </style>

где,

  • windowSplashScreenBackground- это цвет фона вашего экрана-заставки.
  • windowSplashScreenAnimatedIcon- ресурс значка для отображения в центре экрана-заставки. Это может быть обычный рисуемый значок, анимированный рисунок или анимированный вектор.
  • windowSplashScreenAnimationDuration- Продолжительность (в миллисекундах) анимации центральной иконки, если это анимированный ресурс. Имейте в виду, что анимация здесь будет работать только в Android 12 или выше.
  • postSplashScreenTheme- Это тема вашего приложения, которая будет применена после завершения заставки.

Шаг 3:

Добавьте эту тему в файл AndroidManifest.xml. Ваш манифест будет выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.otb.splashdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MySplash">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

см. свойство android:theme="@style/Theme.MySplash".

Шаг 4

Внутри действия запуска вызовите функцию расширения installSplashScreen() перед setContentView(). Ниже приведен пример:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        installSplashScreen()
        setContentView(R.layout.activity_main)
    }
}

😃 Вот оно!!! Действительно простые шаги, верно?

Расширенные шаги

А что, если вы хотите сохранить заставку до загрузки некоторых данных из локального или удаленного источника данных? Затем вы можете выполнить несколько дополнительных шагов:

Шаг 5

Чтобы сохранить экран-заставку даже после того, как приложение вошло в процесс, вам нужно использовать прослушиватель предварительной отрисовки. Измените свою деятельность следующим образом:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        installSplashScreen()
        setContentView(R.layout.activity_main)
        setupPreDrawListener()
    }

    /**
     * Use this method only if you want to keep splash screen for longer than cold start time.
     * Manage `isReady` flag according to your logic.
     */
    private fun setupPreDrawListener() {
        // 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 if the initial data is ready.
                    val isReady = true
                    return if (isReady) {
                        // The content is ready; start drawing.
                        content.viewTreeObserver.removeOnPreDrawListener(this)
                        true
                    } else {
                        // The content is not ready; suspend.
                        false
                    }
                }
            }
        )
    }
}

Шаг 6

Если вы хотите выйти из заставки с какой-либо анимацией, вы можете сделать это с помощью поля расширения splashScreen. Это будет работать только для Android 12. Используйте приведенный ниже метод для создания пользовательской анимации выхода:

private fun exitWithSlideUp(){
        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()
        }
    }

Для удобства моих читателей я создал Splash Demo GitHub Repo, где вы можете увидеть пример реализации API заставки.

Заключение

Первое впечатление - последнее впечатление. Если пользователь увидит пустой экран при запуске приложения, это окажет негативное влияние. Экран-заставка является очень полезным API для обеспечения лучшего взаимодействия с пользователем. Чтобы узнать больше о заставке, вы можете прочитать официальный документ.
Баннер блога принадлежит Wajahat Karim. Первоначально опубликовано в моем аккаунте dev.to.
Спасибо, что читаете мой блог. 😇😇😇