美文网首页Android开发经验谈Android开发Android开发
Android 状态栏、底部导航栏的那些事

Android 状态栏、底部导航栏的那些事

作者: 浪够_ | 来源:发表于2018-10-18 16:36 被阅读73次

    1. 需求

    平常项目中,对顶部状态栏Status Bar,以及底部导航栏Navigation Bar的操作一般可以概括为以下几个场景:

    • 隐藏状态栏,导航栏,用户交互时(点击或滑动屏幕)出现(或不出现)。如欢迎、登录、全屏视频播放、阅读等界面使用。
    • 透明状态栏,图片或布局延伸到状态栏
    • 状态栏字体默认为白色,部分 app 修改为黑色
    • 变色状态栏,修改状态栏背景颜色

    2. 相关API

    我们沿着Android API的发展时间从头来说,另外,建议多看源码,这块内容,在源码注释里写的非常清楚

    1. API 1
    • FLAG_FULLSCREEN

    Window flag,隐藏系统状态栏,代码中设置flag一般如下:

    // 全屏布局且隐藏状态栏:
    //4.4 上,顶部下滑,出现半透明状态栏,过一会儿状态栏消失
    //4.1 上,顶部下滑,没反应
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    

    效果和通过主题样式的方式在styles.xml文件中设置属性android:windowFullscreen 是一样的,都是通过设置window的属性来影响窗口上修饰控件的显示

    2. Android3.0

    在Android3.0中,View添加了一个重要的方法:View.setSystemUiVisibility(int),通过窗口根View(DecorView)提供的方法来直接控制其上的窗口装饰元素System UI的显示和隐藏,并添加了

    • View.STATUS_BAR_VISIBLE
    • View.STATUS_BAR_HIDDEN :实测statusbar不会消失,仅隐藏statusbar 部分内容

    两个Flag用于控制Status Bar的显示与隐藏。
    一般是这么用的:

     View decorView = getWindow().getDecorView();
     int uiOptions =  View.STATUS_BAR_VISIBLE;
     decorView.setSystemUiVisibility(uiOptions);
    
    3. Android4.0
    • View.STATUS_BAR_VISIBLE 改为 View.SYSTEM_UI_FLAG_VISIBLE

    • View.STATUS_BAR_HIDDEN 更名为 View.SYSTEM_UI_FLAG_LOW_PROFILE,该 flag 同时影响 StatusBar 和 NavigationBar ,但并不会使得 SystemUI 消失,而只会使得背景很浅,并且去掉 SystemUI 的一些图标或文字。

    另外添加了一个flag:SYSTEM_UI_FLAG_HIDE_NAVIGATION,会隐藏NavigationBar,但是由于NavigationBar是非常重要的,因此只要有用户交互(例如点击屏幕),系统就会清除这个flag使NavigationBar就会再次出现。

    4. Android 4.1
    • View.SYSTEM_UI_FLAG_FULLSCREEN: 这个标志与WindowManager.LayoutParams.FLAG_FULLSCREEN有相同的视觉效果(全屏布局且隐藏状态栏),但在系统手势交互后两者在4.4以上有不同表现
      —— 4.1 上顶部下滑没反应
      —— 4.4 上顶部下滑从新出现状态栏,不透明,且挤压 Activity 的布局。
    • View.SYSTEM_UI_FLAG_LAYOUT_STABLE: 与其它flag配合使用,防止系统栏隐藏时内容区域发生变化。

    • View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。此flag与透明状态栏一起使用,就可以实现现在不少app实现的状态栏透明,图片或布局延伸到状态栏的效果了,不过这块需要针对不同API级别进行适配,主要因为状态栏透明在不同的API上显示不尽相同。

    • View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION: 使内容布局到NavigationBar之下。

    5. Android 4.4
    • View.SYSTEM_UI_FLAG_IMMERSIVE

    该标志是SYSTEM_UI_FLAG_HIDE_NAVIGATION修饰符,也只有和它结合使用时才有效果,并且它只有一个作用,单独使用 SYSTEM_UI_FLAG_HIDE_NAVIGATION ,导航栏消失,不过系统将在任何用户交互时强制清除SYSTEM_UI_FLAG_HIDE_NAVIGATION,导航栏会再次出现。添加 View.SYSTEM_UI_FLAG_IMMERSIVE 后,交互时导航栏不会出现,但如果底部向上滑动时,导航栏仍会出现。

    • View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

    使用此标志创建沉浸式体验,它是SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_HIDE_NAVIGATION的修饰符,因此只有与其中一个或两个标志组合使用时才会产生效果。

    该标志和 View.SYSTEM_UI_FLAG_FULLSCREEN 配合使用:状态栏隐藏在沉浸模式下,但可以通过系统手势暂时显示出来,比如从屏幕顶部滑动。这些暂时的系统栏将覆盖应用程序的内容,可能有一定程度的透明度,并会在短时间后自动隐藏。

    该标志和 SYSTEM_UI_FLAG_HIDE_NAVIGATION 配合使用:导航栏隐藏在沉浸模式下,底部向上滑动出现,过一段时间自动隐藏。

    • FLAG_TRANSLUCENT_STATUS

    这个属于Window flag,也可以在主题中设置android: windowTranslucentStatus设置该属性,当使用这个flag时SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN会被自动添加,同时,设置FLAG_TRANSLUCENT_STATUS也会影响到StatusBar的背景色,但并没有固定的表现:

    —— 对于7.0以上的机型,设置此flage会使得StatusBar半透明
    —— 对于6.0以上的机型,设置此flage会使得StatusBar完全透明
    —— 对于5.x的机型,大部分是使背景色半透明,小米和魅族以及其它少数机型会全透明
    —— 对于4.4的机型,小米和魅族是透明色,而其它系统上就只是黑色到透明色的渐变。

    • FLAG_TRANSLUCENT_NAVIGATION

    Window flag,也可以在主题中设置android: windowTranslucentNavigation设置该属性,当使用这这个flag时SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION会被自动添加。同时,设置FLAG_TRANSLUCENT_STATUS也会影响到 NavigationBar 的背景色,效果与 FLAG_TRANSLUCENT_STATUS 相同。

    6. Android 5.0
    • 主题里通过colorPrimaryDark来指定 StatusBar 背景色

    • 可以调用 window.setStatusBarColor(@ColorInt int color) 来修改状态栏颜色,但是让这个方法生效有一个前提条件:你必须给window添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS并且取消FLAG_TRANSLUCENT_STATUS

    7. Android 6.0

    在Android6以后,我们只要给SystemUI加上SYSTEM_UI_FLAG_LIGHT_STATUS_BAR这个flag,就可以让字体和图标变为黑色。

    相关文章

      网友评论

        本文标题:Android 状态栏、底部导航栏的那些事

        本文链接:https://www.haomeiwen.com/subject/zpojzftx.html