Эксперименты с новыми API Android 12

Смотрим на новый экран загрузки приложений
2 минуты2068

В Android 12 довольно много нововведений, касающихся внешнего вида, и одно из самых заметных — появление экрана загрузки (splash screen). В новой операционной системе у каждого приложения будет стандартный экран загрузки независимо от того, нужен этот экран или нет. Таким образом в новой операционной системе еще больше унифицируется внешний вид приложений. Это хорошо для пользовательского опыта, но плохо для тех разработчиков, которые создавали свои собственные экраны загрузки — теперь они будут появляться после стандартного экрана и никак иначе. Но есть и хорошие новости — экран загрузки можно модифицировать под себя. Давайте посмотрим, какие возможности у разработчика есть и что можно с этим сделать.

Для наших экспериментов нам понадобится Android Studio, которую можно скачать бесплатно с официального сайта. А также эмулятор со свежей операционной системой на борту. Для этого установим новый эмулятор с АПИ 31, но для начала создадим новый проект через File -> New Project. В меню выберем Empty Activity:

На следующем экране дадим название проекту и нажмем кнопку Finish:

Когда проект загрузится, перейдем в файл Gradle и убедимся, что указан верный SDK:

Нам нужны compileSdkVersion и targerSdkVersion именно 31 — это версия новой ОС, если версия стоит ниже — исправьте на 31 и синхронизируйте проект:

Также убедимся, что в Манифесте нашего приложения указан атрибут exported, иначе приложение просто не запустится. Это касается всех приложений, которые должны устанавливаться на телефоны с новой операционной системой:

<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>

Пришло время скачать и запустить эмулятор с новейшей операционной системой на борту. Если у вас эмулятор еще не стоит, то откройте Device Manager (вкладка Tools -> AVD Manager) и нажмите в появившемся окне кнопку Create Virtual Device:

Выберите любой смартфон по вкусу:

Далее, во вкладке x86 Images выберите API 31 в качестве операционной системы эмулятора:

И, наконец, дайте название устройству. Finish:

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

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

Пришло время модифицировать экран загрузки. Для этого откроем ресурсы приложения:

И добавим в него следующие строки:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 
   <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
      ...
       <item name="android:windowSplashScreenBackground">@color/color_error</item>
       <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_android</item>
       <item name="android:windowSplashScreenIconBackgroundColor">@color/color_gray</item>
       <item name="android:windowSplashScreenBrandingImage">@drawable/ic_apple</item>
   </style>
</resources>

Вы увидите, что среда разработки рекомендует вынести эти атрибуты в отдельный файл, потому что они касаются исключительно API 31 и выше. Последуем совету:

Поставим курсор на подчеркнутую строку, нажмем Alt+Enter и выберем соответствующую опцию в выпадающем меню:

Отдельный файл появится в тех же ресурсах:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
 
   <style name="Theme.NewApi" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
       <!-- Primary brand color. -->
       <item name="colorPrimary">@color/purple_500</item>
       <item name="colorPrimaryVariant">@color/purple_700</item>
       <item name="colorOnPrimary">@color/white</item>
       <!-- Secondary brand color. -->
       <item name="colorSecondary">@color/teal_200</item>
       <item name="colorSecondaryVariant">@color/teal_700</item>
       <item name="colorOnSecondary">@color/black</item>
       <!-- Status bar color. -->
       <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
       <!-- Customize your theme here. -->
       <item name="android:windowSplashScreenBackground">@color/black</item>
       <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_launcher_background</item>
       <item name="android:windowSplashScreenIconBackgroundColor">
           @color/cardview_light_background
       </item>
       <item name="android:windowSplashScreenBrandingImage">@drawable/android</item>
   </style>
</resources>

Новые атрибуты, которые мы добавили:

  • windowSplashScreenBackground указывает на цвет заливки экрана загрузки;
  • windowSplashScreenAnimatedIcon позволяет поставить свою иконку (в том числе и анимированный drawable)
  • windowSplashScreenIconBackgroundColor устанавливает цвет заливки заднего фона иконки (если иконка полупрозрачная или занимает не все место)
  • windowSplashScreenBrandingImage позволяет добавить еще одну иконку (например, логотип компании)

Параметры мы выбрали стандартные, которые уже есть в ресурсах. Единственное, что мы добавили — это картинку с сайта GeekBrains для отображения логотипа компании.

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

Не самый лучший дизайн, но теперь мы знаем, как изменить стандартный экран загрузки под себя.

Давайте пойдем еще дальше и изменим время отображения экрана. Из ресурсов это сделать, к сожалению, нельзя. Для этого нужно писать код в той активити, которая первой отображается на экране при запуске приложения. У нас это MainActivity. Добавим в onCreate следующий код:

var isHideSplashScreen = false
 
object : CountDownTimer(2000, 1000) {
   override fun onTick(millisUntilFinished: Long) {}
   override fun onFinish() {
       isHideSplashScreen = true
   }
}.start()
 
val content: View = findViewById(android.R.id.content)
content.viewTreeObserver.addOnPreDrawListener(
   object : ViewTreeObserver.OnPreDrawListener {
       override fun onPreDraw(): Boolean {
           return if (isHideSplashScreen) {
               content.viewTreeObserver.removeOnPreDrawListener(this)
               true
           } else {
               false
           }
       }
   }
)

Тут мы запускаем таймер обратного отсчета, и как только он закончит работу — прячем экран загрузки. Прятать splash screen можно и после загрузки каких-то данных, или после любого события, которое готовит ваше приложение к работе. 

Скачать полный проект можно по ссылке.

android 12andrioid-разработкаразработка мобильных приложенийпрограммирование
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!