#android

Splash Screen Android - O Jeito Mais Simple e Eficaz

Antes de mais nada, você precisará das imagens da splash screen nos tamanhos:

res/
  drawable-xxxhdpi/
  drawable-xxhdpi/
  drawable-xhdpi/
  drawable-hdpi/
  drawable-mdpi/

Agora, copie essas imagens para a(s) pasta(s) drawable do seu projeto.

Próximo passo é ter disponível um arquivo desenhável (drawable xml) que armazenará o fundo e o bitmap associado. Dito isto, crie um arquivo drawable para hospedar o logo chamado splash_bg.xml na pasta drawable.

Note que é a pasta principal drawable, não as demais com tamanhos específicos.

Este arquivo deve conter a tag xml raiz chamada de layer-list.

Essa tag permite que os componentes sejam adicionados em listas de camadas. Por isso o nome XD.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
</layer-list>

O primeiro item da camada será uma cor de fundo - background.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/white" />

</layer-list>

O segundo item da camada será o bitmap do nosso logo

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/white" />
    <item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/logo" />
        <!-- logo é o nome do arquivo -->
    </item>

</layer-list>

Primeira etapa concluída!

Criando um tema específico para Splash Screen

Agora precisamos avisar ao sistema android que esse drawable é um drawable do tema.

Abrindo o arquivo de temas (geralmente é themes.xml), crie um novo tema.

<style name="Theme.Splash" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="android:statusBarColor">@color/white</item>
    <item name="android:windowBackground">@drawable/splash_bg</item>
</style>

Vamos analisar esse trecho de código.

  1. O tema que herdamos não possui a action bar/toolbar.
  2. alteramos a cor da status bar para branco.
  3. informamos na propriedade windowBackground que o fundo da tela deve ser um arquivo drawable.

Agora, acessando o AndroidManifest.xml, devemos alterar o tema da aplicação para o novo tema.

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

    <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.Splash">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

Definindo Activity com Splash Screen

Ao rodar o app no smartphone ou emulador, você notará que a Splash aparece mas ela não desaparece. Precisamos de uma lógica para isso.

Antes de setar o conteúdo com o setContentView(), devemos retornar para o tema principal que estava antes da splash ser criada.

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

        setTheme(R.style.Theme_Main)

        setContentView(R.layout.activity_main)
    }
}

Agora, caso queira que a splash demore um pouco mais, você pode atrasar usando o Thread.sleep(1000). Isso faz com que a thread atual demore um pouco.

Como esta é a primeira Activity, não tem problema manter um timeout no início do projeto.

Assista ao video