android启动页全屏适配

冷知识弥补

首先要了解,在app从系统launcher点击图标启动的时候,一共分为两个部分(界面),一个是默认的windowBackground,第二个是splash页的xml。由于application中对整个app设置了theme属性,从而会影响到第一个windowBackground的显示,如果是drak主题,默认进来就是黑的,如果是light,默认进来是白的。所以会有朋友遇到,一启动就显示白屏,过1~2秒才跳出来splash页。

最终表现

  1. windowBackground阶段:隐藏状态栏、隐藏actionbar、透明导航栏(虚拟菜单栏)。
  2. splashActivity阶段:隐藏状态栏、隐藏actionbar、隐藏导航栏。

做法

隐藏状态栏和actionbar太简单了就不一一阐述了,这里要强调一下导航栏的处理(有些机型没有,有些机型有,可以设置是否显示)。

在适配过程中,有些启动屏是一启动默认设置一张和splash页相同的图,但是启动的时候,默认的windowBackground是全屏的,它会无视c导航栏,就会发生导航栏遮挡背景的情况,由于无法在style的theme设置隐藏导航栏,因此只能加入下面两个属性来透明导航栏。

<item name="android:navigationBarColor">@color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>

等到splash页的时候,在onCreate里,代码动态设置隐藏导航栏

override fun onCreate(savedInstanceState: Bundle?) {
     
        val decorView: View = window.decorView
        val uiOptions: Int = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN)
        decorView.systemUiVisibility = uiOptions
}

贴出完整的theme代码

<style name="Theme_Splash" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_bg</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:navigationBarColor">@color/transparent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
</style>

坑:

切记不要在splash的theme中使用透明属性

<item name="android:windowIsTranslucent">true</item>

该属性会在部分手机中,使得状态栏能透到桌面背景,还会极大减慢手指点击桌面图标app启动的速度。(最明显的一个手机,冷启动点击桌面图标的时候,点击完成,图标会泛白一下,然后大概2s后才会弹出界面,所以导致我经常觉得自己是不是没有点击到图标,延迟感非常严重。)

注:override fun onCreate(savedInstanceState: Bundle?) {
val decorView: View = window.decorView
val uiOptions: Int = (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN)
decorView.systemUiVisibility = uiOptions
}
上述中,这个属性的设置,会导致页面失去focus焦点,第一下点击失效(例如首页广告闪屏点击,需要点两次才会触发click),后面浏览了android的官方文档,发现有较为全面的全屏适配方案,参考官网
https://developer.android.com/training/system-ui/immersive

你可能感兴趣的:(android)