Desde que Android lanzó la nueva API de pantalla de bienvenida con Android 12, muchas aplicaciones tuvieron problemas con pantallas de bienvenida duplicadas, falta de personalización, etc.
En este momento, es posible configurar el color de fondo y el ícono en el medio, pero ¿es posible personalizarlo un poco más? Dado que en este momento estamos limitados a usar un fondo de un solo color y un ícono de logotipo no redimensionable que no se ve muy bien.
Lo que estoy tratando de lograr es una pantalla de inicio personalizada, con una imagen dibujable como fondo (o una lista de capas con 2 elementos: una imagen de fondo y un logotipo centrado), ya que podría usarse antes de Android 12.
¿Alguien logró lograr este tipo de comportamiento?
Existe una solución alternativa para establecer el atributo windowIsTranslucent en verdadero y mostrar solo el segundo elemento (el correcto), pero presenta una mala experiencia de usuario, ya que parece que la aplicación no responde durante unos segundos.
Hice algo como esto. Primero elimine el dibujable predeterminado
<style name="Theme.App.Starting" parent="Theme.SplashScreen"> <item name="windowSplashScreenBackground">@color/...</item> <item name="windowSplashScreenAnimatedIcon">@android:color/transparent</item> <item name="postSplashScreenTheme">@style/AppTheme</item> </style>Luego infle su vista de presentación personalizada
class MainActivity : AppCompatActivity(), SplashScreen.OnExitAnimationListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val installSplashScreen = installSplashScreen() installSplashScreen.setOnExitAnimationListener(this) setContentView(R.layout.activity_main) } override fun onSplashScreenExit(splashScreenViewProvider: SplashScreenViewProvider) { val view = splashScreenViewProvider.view if (view is ViewGroup) { val binding = ActivityMainSplashBinding.inflate(layoutInflater,view, true) // Do what you want with your inflated view animate(view) { // Remove splash splashScreenViewProvider.remove() } } } private fun animate(view: View, doOnFinish: () -> Unit) { view.animate() .withEndAction(doOnFinish) .start() } }Al final, recuerde llamar a splashScreenViewProvider.remove() para eliminar la salpicadura.