• Android 对于状态栏和导航栏的操作


    设置状态栏背景颜色
    window.statusBarColor = Color.WHITE
    设置状态栏和导航栏的浅色和深色(默认)状态
    1. ......
    2. //根据背景颜色是否高亮
    3. setStatusBarBgColor(ColorUtils.calculateLuminance(Color.WHITE)>=0.5)
    4. ......
    5. private fun setStatusBarBgColor(isLightColor: Boolean) {
    6. if (isLightColor){
    7. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
    8. val insetsController = window.insetsController
    9. //浅色状态栏
    10. insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
    11. //浅色导航栏
    12. insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)
    13. }else{
    14. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    15. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    16. // 为了使这个生效,窗口必须请求WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
    17. // 不能请求WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
    18. // 浅色状态栏背景兼容的模式绘制。
    19. window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    20. }
    21. }else{
    22. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
    23. val insetsController = window.insetsController
    24. //清除状态栏设置
    25. insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
    26. //清除导航栏设置
    27. insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)
    28. }else{
    29. //默认状态栏
    30. window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
    31. }
    32. }
    33. }
    侵入式状态栏
    1. // 通知视窗,我们(应用)会处理任何系统视窗(而不是 decor)
    2. window.setDecorFitsSystemWindows(false)
    3. // 或者您可以使用 AndroidX中的 WindowCompat
    4. // 兼容api30以下的
    5. // view.systemUiVisibility =
    6. // 通知系统,视窗希望在极端的情况下该如何布局内容。查看文档来获取更具体的信息。
    7. // View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
    8. // 通知系统,视窗希望在导航栏被隐藏的情况下如何布局内容。
    9. // View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    10. WindowCompat.setDecorFitsSystemWindows(window, false)
    计算键盘高度动态设置窗口 处理视觉冲突 

    这里可以获取状态栏和导航栏

    navigationBars()用于导航的任何系统栏

    statusBars()用于显示状态的任何系统栏

    1. ViewCompat.setOnApplyWindowInsetsListener(
    2. window.decorView
    3. ) { v, insets ->
    4. val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
    5. v.setPadding(
    6. 0,
    7. 0,
    8. 0,
    9. imeHeight + insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
    10. )
    11. // 返回边衬区,这样它们才能够继续在视图树中继续传递下去
    12. insets
    13. }
    隐藏\显示状态栏和导航栏
    1. /**API 28 以上 状态栏位置上被黑条占领 问题解决 **/
    2. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    3. val lp = window.attributes
    4. lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    5. window.attributes = lp
    6. }
    7. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    8. val controller: WindowInsetsController? = window.decorView.windowInsetsController
    9. //从边缘滑动以显示隐藏栏。 无论导航栏的可见性如何,手势导航都有效。
    10. //API level 31
    11. // controller?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_DEFAULT
    12. //“粘性沉浸模式”。 从边缘滑动以暂时显示隐藏栏。
    13. controller?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    14. //WindowInsets.Type.navigationBars() (底部)导航栏
    15. //WindowInsets.Type.statusBars() (顶部)状态栏
    16. //WindowInsets.Type.systemBars() (底部和顶部)系统栏
    17. if(false) controller?.show/*显示*/(WindowInsets.Type.systemBars())
    18. else controller?.hide/*隐藏*/(WindowInsets.Type.systemBars())
    19. } else {
    20. window.decorView.systemUiVisibility = (
    21. View.SYSTEM_UI_FLAG_IMMERSIVE
    22. // 将内容设置为显示在系统栏下方,以便在系统栏隐藏和显示时内容不会调整大小。
    23. or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    24. or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    25. or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    26. //隐藏导航栏和状态栏
    27. or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    28. or View.SYSTEM_UI_FLAG_FULLSCREEN
    29. )
    30. }

  • 相关阅读:
    计算机毕业设计(附源码)python-重庆工程学校学生体测监测系统-微信小程序
    拆解联想普慧算力逻辑链:一次新的场景革命
    离线部署NFS文件系统
    CCS:调试
    1008. 前序遍历构造二叉搜索树
    画图带你彻底弄懂三级缓存和循环依赖的问题
    opencv连通域标记 connectedComponentsWithStats()函数
    力扣(LeetCode)81. 搜索旋转排序数组 II(C++)
    Verilog:【3】边沿检测器(edge_detect.sv)
    网络安全等级保护细则
  • 原文地址:https://blog.csdn.net/qq_50675668/article/details/134059223