Привет всем! Увлекаетесь разработкой под Android? Если да, то вы могли замечать, что белый (сейчас уже может быть и не белый) пустой экран при первой загрузке приложения может занять какое-то время. Ребята из гугла того же мнения, а потому во многих их приложениях есть такая штука как Splash Screen.
Его пользователь видит пока приложение загружает всё что нужно. Решений есть несколько, но самым простым и быстрым мне показалось то, о котором я сегодня расскажу. Но заранее хочу уточнить, что мы используем его не для загрузки каких-то крупных объемов данных или подобного. Он нам нужен лишь чтобы скрасить загрузку основной активности, где уже и будут происходить все необходимые подгрузки. И да, второй и последующие запуски могу сократить время видимости этого экрана. Это не плохо и даже хорошо, но я видел когда-то как разработчики добавили таймер для Splash Screen. Почему это решение плохое? Ну, вот таймер стоит на 3 секунды, а приложению нужна бы была всего одна. Разница не особо велика, но пользователи ведь явно не на красивую картинку посмотреть пришли.
Splash Screen
Для отображения этого Splash Screen нам не нужны никакие layout или даже view. Они позволяют более тонко всё настроить, но их создание требует времени, а мы хотим показать этот сплеш как можно скорее. Потому создаём пустую Activity, единственная цель которой – запуск вашей MainActivity.
1 2 3 4 5 6 7 8 9 10 11 12 |
import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity open class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) startActivity(Intent(this, MainActivity::class.java)) finish() } } |
Активность буквально пуста, она сразу же после создания запускает MainActivity и заканчивает свою работу.
Но где взять содержимое? В стилях! Я ещё добавил прозрачные панель навигации и статусбар, так как так будет красивее. А содержимое экрана указано в windowBackground.
1 2 3 4 5 |
<style name="SplashTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="android:windowTranslucentNavigation" tools:targetApi="kitkat">true</item> <item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item> <item name="android:windowBackground">@drawable/splash_background</item> </style> |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/white"/> <item> <bitmap android:gravity="center" android:src="@drawable/icon_splash" /> </item> </layer-list> |
То, о чем бы стоило сказать заранее, для корректного отображения на разных экранах в ресурсы нужно будет добавить несколько версий изображения разных размеров. Небольшой лишний груз в плане веса, но бандлы должны срезать лишнее, если вы публикуете приложения не в apk.
Можно ещё для night версии добавить тёмную версию, т.к. в последний год тёмная тема стала тем, что само собой должно быть.
Для этого просто дублируем ресурс и указываем другой цвет фона.
На этом всё, ваш Splash Screen готов! Только не отобразить в лаунчере именно Splash активность:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<activity android:name=".SplashActivity" android:theme="@style/SplashTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> |
И теперь вот совсем всё, можно запускать!
Идеальное ли решение? Скорее всего нет, но очень простое 😀
О. Правда на новой miui такие экраны в моих и не только приложениях получили небольшое затемнение. Не уверен почему, но как только разберусь внесу правки (если честно, только сейчас про это вспомнил, хотя проблема появилась ещё в сентябре. Но материал написан, так что буду разбираться)
Ещё полезное: