在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:沉浸式状态栏设置

废话少说直接上代码

// 首先导入ktx核心包
implementation 'androidx.core:core-ktx:1.6.0'

1:状态栏显示控制


/**
*  显示状态栏
*  @param isVisible 是否显示
*/
fun setStatusBarVisible(activity: Activity, isVisible: Boolean) {val window = activity.windowWindowCompat.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)版本来操作状态栏,如果对你有用请点赞或者评论留言

Android 状态栏常规操作(状态栏显示,状态栏颜色,沉浸式状态栏)相关推荐

  1. Android 4.4之后状态栏和导航栏细节美化(沉浸式状态栏)

    转载请注明出处:http://blog.csdn.net/demokui/article/details/54603284 本篇文章出自:[姜奎的博客] 1. 简介 其实标题我是打算叫"抢眼 ...

  2. Android开发之5.0已以上版本沉浸式状态栏

    方法一:(5.1.1,6.0.1,7.1.2通用) try {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {Window ...

  3. 高大上的Android沉浸式状态栏?

    背景 之前做过Android沉浸式状态栏的相关需求,但是一直忙于工作,没时间系统的整理下沉浸式相关的知识,所以今天抽出时间,写一篇 Android沉浸式状态栏的文章. 何为沉浸式 沉浸式就是要给用户提 ...

  4. Android 沉浸式状态栏和全面屏遇到刘海屏

    文章目录 一.沉浸式状态栏 1.1 Android 4.4(API 19)- Android 5.0( API 21) 1.2 Android 5.0(API 21)以上版本 1.3 Android ...

  5. Android沉浸式状态栏,看完这篇就够了!

    背景 之前做过Android沉浸式状态栏的相关需求,但是一直忙于工作,没时间系统的整理下沉浸式相关的知识,所以今天抽出时间,写一篇 Android沉浸式状态栏的文章. 何为沉浸式 沉浸式就是要给用户提 ...

  6. Android沉浸式状态栏(透明系统状态栏)

    Android沉浸式状态栏(透明系统状态栏)的目的:顶部系统状态栏和App的导航栏一体化,不给用户突兀的感觉,使用户把更多的视角留在我们的App上. 沉浸式状态栏的兼容情况 Android版本 透明状 ...

  7. Android开发笔记(一百六十三)高仿京东的沉浸式状态栏

    前面的文章介绍了如何实现广告轮播的Banner效果,本想可以告一段落.然而某天产品经理心血来潮,拿着苹果手机,要求像iOS那样把广告图顶到状态栏这儿.刚接到这需求,不禁倒吸一口冷气,又要安卓开发去实现 ...

  8. android 沉浸式状态栏 兼容低版本,Android 沉浸式状态栏适配方案

    首先说下什么是沉浸式状态栏:这是android4.4以后开始支持的一种效果,状态栏不再是一个黑条,而是置为透明或者半透明,然后页面延伸到状态栏下面,这样状态栏区域也可以成为app页面显示区域的一部分, ...

  9. Android 沉浸式状态栏(QQ5.0透明状态栏的效果)

    大家注意一个问题: 魅族4.4系统,如果增加沉浸式状态栏,页面底部如果有按钮可能会被魅族的smbar遮挡,导致按钮不能被点击到的现象 看上面的这张图就是,魅族smatbar被隐藏后,挡住底部按钮,并且 ...

  10. android 自定义输入法布局,Android 解决沉浸式状态栏下,输入法弹出,布局不会自动调整的BUG...

    一.前言 在开发中,如果输入框在布局的底部.在弹出输入发时,为了使输入法不遮挡输入框通常有两种做法: 1.将布局压缩(Activity的android:windowSoftInputMode属性设置为 ...

最新文章

  1. eclipse 向HDFS中创建文件夹报错 permission denied
  2. windows核心编程 如何等待超过64(MAXIMUM_WAIT_OBJECTS) kernal object
  3. phpcms v9调用指定栏目名称、url、图片、描述等
  4. ACM入门之【单调栈】
  5. PHP的Static与Global
  6. timertask run函数未执行_图执行模式下的 TensorFlow 2
  7. Java Web-面试题
  8. 几乎是苹果6倍!华为可穿戴设备出货量Q1同比猛增282%
  9. Maven——原理与使用(一)
  10. 【Python】python网络协议
  11. 机器学习方法(一)——梯度下降法
  12. 《啊哈算法》的Java实现| 第五章:图
  13. Neo4j的下载与安装
  14. Base64、32、16 编码解析
  15. B站视频、音频分开传输
  16. 网站推广优化教程100条(完整版)-
  17. ubuntu18单机部署k8s(v1.14.1)
  18. 贾扬清谈云原生 - 让数据湖加速迈入3.0时代
  19. 趋势丨从云到多云,超融合与云管平台如期而遇
  20. 视频播放开发笔记-获取MPV的视频内存方式截图

热门文章

  1. unbuntu 安装vscode
  2. Prometheus的函数和计算公式
  3. 《天下少年英雄》隐私政策
  4. 环境配置 python 3.6+Anaconda+cuda9.0+cudNN7.0+Tensorflow
  5. 纯js轮播图练习-3,类似于淘宝海报带小圆点轮播图
  6. 购买阿里云服务器发布项目后外网无法访问的解决办法
  7. 基于JavaWeb的订餐管理系统的设计与实现
  8. Smart Beta是什么?
  9. linux下ScrollLock键盘灯不亮
  10. mongodb 副本集搭建