android沉浸式状态栏,启动页隐藏状态栏

本次分享的代码分为以下功能:

1:状态栏显示控制

2:状态栏颜色控制

3:状态栏字体颜色控制

4:沉浸式状态栏设置

5:启动页隐藏状态栏

6:启动页全屏适配

添加依赖

core-ktx1.5.0版本开始就是可以使用这个了。
首先添加依赖

implementation "androidx.core:core-ktx:1.7.0"

1. 状态栏显示控制

/**
*  显示状态栏
*  @param isVisible 是否显示
*/
fun setStatusBarVisible(activity: Activity, isVisible: Boolean) {
    val window = activity.window
    WindowCompat.setDecorFitsSystemWindows(window, isVisible)
    WindowInsetsControllerCompat(window, window.decorView).let { controller ->
       if (isVisible) {
          controller.show(WindowInsetsCompat.Type.statusBars())
       } else {
          controller.hide(WindowInsetsCompat.Type.statusBars())
       }
          controller.systemBarsBehavior =
             WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }
}

// 控制状态栏操作效果

WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

效果(状态栏):当全屏时,你下拉状态栏,状态栏出现后会在几秒后消失

 使用效果:

 StatusBarUtil.setStatusBarVisible(this, false)

 2. 状态栏颜色控制

/**
 *  设置状态栏颜色
 *  这里还是直接操作window的statusBarColor
 */
fun setStatusBarColor(activity: Activity, @ColorInt color: Int) {
    activity.window.statusBarColor = color
}

 使用效果:

StatusBarUtil.setStatusBarColor(this,Color.BLUE)

3. 状态栏字体颜色控制 

/**
 *  设置状态栏字体颜色
 *  此api只能控制字体颜色为 黑/白
 *  @param color 这里的颜色是指背景颜色
 */
fun setStatusBarTextColor(activity: Activity, @ColorInt color: Int) {
    // 计算颜色亮度
    val luminanceValue = ColorUtils.calculateLuminance(color)
    WindowInsetsControllerCompat(activity.window, activity.window.decorView).let { controller ->
        if (color == Color.TRANSPARENT) {
            // 如果是透明颜色就默认设置成黑色
            controller.isAppearanceLightStatusBars = true
        } else {
            // 通过亮度来决定字体颜色是黑还是白
            controller.isAppearanceLightStatusBars = luminanceValue >= 0.5
        }
    }
}

使用效果:

//val backgroundColor=Color.WHITE 
val backgroundColor=Color.BLUE
StatusBarUtil.setStatusBarColor(this,backgroundColor)     //设置状态栏颜色
StatusBarUtil.setStatusBarTextColor(this,backgroundColor) // 字体颜色

4. 沉浸式状态栏设置

/**
 *  沉浸式状态栏
 *  @param contentColor 内容颜色:获取内容的颜色,传入系统,它自动修改字体颜色(黑/白)
 */
fun immersiveStatusBar(activity: Activity,@ColorInt contentColor:Int) {
    val window = activity.window.apply {
        statusBarColor = Color.TRANSPARENT
    }
    // 设置状态栏字体颜色
    setStatusBarTextColor(activity, contentColor)
    // 把内容放到系统窗口里面 可以去了解一下Window和decorView的关系
    WindowCompat.setDecorFitsSystemWindows(window, false)
}

使用效果:

val contentColor = Color.parseColor("#0000FF") 
StatusBarUtil.immersiveStatusBar(this, contentColor)

5. 启动页隐藏状态栏

自定义全屏主题 AppTheme.Splash :

<!--全屏主题-->
<style name="AppTheme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <!-- 设置window过度效果 禁用窗口的预览动画 -->
    <item name="android:windowDisablePreview">false</item>
</style>

定义SplashActivity 并在AndroidManifest.xml中设置上自定义的全屏主题

<activity 
    android:theme="@style/AppTheme.Splash"
    android:name=".splash.SplashActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

6. 启动页全屏适配

在全屏主题中追加属性:

<!--全屏主题-->
<?xml version="1.0" encoding="utf-8"?>
<resources>
    ...
    <style name="AppTheme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
       ...
       <!-- 设置statusBarColor 为透明-->
       <item name="android:windowTranslucentStatus">true</item>
       <item name="android:statusBarColor">@android:color/transparent</item>
       <!-- Android P 异性屏适配 可以达到全面屏的效果 -->
       <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
</resources>

好的,以上就是部分api升级到最新的(Android 31)版本状态栏的操作,如果对你有用请点赞或者评论留言

猜你喜欢

转载自blog.csdn.net/weixin_53545232/article/details/127199277