IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 状态栏常规操作(状态栏显示,状态栏颜色,沉浸式状态栏) -> 正文阅读

[移动开发]Android 状态栏常规操作(状态栏显示,状态栏颜色,沉浸式状态栏)

在app开发中,通常都会修改状态栏样式,当你在搜索引擎上一顿操作后搜到的代码都是过时的。

当你把Android SDK 兼容版本调整到30,你会发现处理状态栏的部分代码开始划上横线(弃用)

问:新版API变成什么了?

答:

WindowInsetsControllerCompat

问:为啥要改?

答:当你打开WindowInsetsControllerCompat的构造方法你就会发现该api处理了不同版本的适配,不同于以前直接操作Window添加各种Flag来处理,处理状态栏等都提供了方法方便调用

public WindowInsetsControllerCompat(@NonNull Window window, @NonNull View view) {
    if (SDK_INT >= 30) {
        mImpl = new Impl30(window, this);
    } else if (SDK_INT >= 26) {
        mImpl = new Impl26(window, view);
    } else if (SDK_INT >= 23) {
        mImpl = new Impl23(window, view);
    } else if (SDK_INT >= 20) {
        mImpl = new Impl20(window, view);
    } else {
        mImpl = new Impl();
    }
}

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

1:状态栏显示控制

2:状态栏颜色控制

3:状态栏字体颜色控制

4:沉浸式状态栏设置

废话少说直接上代码

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
    }
}
<!-- 记得加上这个style 不然部分手机状态栏会变黑 -->
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

// 控制内容是否顶到状态栏上面(不清楚可以了解一下window和decorView的关系)

WindowCompat.setDecorFitsSystemWindows(window, isVisible)

// 显示可以控制的部分

WindowInsetsCompat.Type.statusBars()? : 状态栏

WindowInsetsCompat.Type.navigationBars()? : 底部导航栏

WindowInsetsCompat.Type.captionBar()? :标题栏

WindowInsetsCompat.Type.systemBars()? :前三者全部

// 控制状态栏操作效果

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)

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

欢迎加入 QQ群:949746323? 交流Android,Flutter相关的知识

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:19:40  更:2021-08-04 11:21:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:12:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码