Android导航栏和状态栏各种FLAG详解

导航栏和状态栏知识点说明

导航栏和状态栏都是SystemUI的一部分,都是特殊的window。通过WindowManager.addView(View view, WindowManager.LayoutParams params);参数中的params可以对导航栏和状态栏进行一些设置,这个工作细节由WindowManagerService完成。这里可以进行定制的内容包括:

  1. 导航栏显示哪些button,不显示哪些button,这个是隐藏API并且普通应用无效。
  2. 导航栏和状态栏是否显示。
  3. 添加的view是否layout到导航栏或者状态栏后面。
  4. 导航栏和状态栏是否透明。
    注意导航栏和状态栏只能指定使用默认色或者透明效果,半透明效果,并不能指定一个具体的颜色,我们在Activity中看到的导航栏和状态栏的可以指定的颜色其实是activity的DecorView的颜色,而此时导航栏和状态栏是透明的。DecorView有两个View专门用来“模拟”显示导航栏和状态栏的。

FLAG分析

FLAG很多,可以划分为针对导航栏的和针对状态栏的。按功能分可以分成用于隐藏的、指定Layout的、其他的。
1.指定Layout的就是说新加的View是否可以绘制到SystemBar(导航栏或状态栏,下同)后面。
括号内表示可以layout到其后面
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(状态栏)
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN(状态栏)
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION(导航栏和状态栏,注意这个并不会隐藏导航栏,而且真的对状态栏也有效)
2.隐藏SystemBar,注意隐藏相应Bar后也就表示会自动的Layout到相应区域
View.SYSTEM_UI_FLAG_FULLSCREEN(状态栏)
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION(导航栏)
3.指定Bar的状态的(透明,背景色等)
WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
根据Android源码,带此标记自动附加标记SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,这个标记表示SystemBar的位置的背景由添加的Window来负责绘制,SystemUI将是透明的。注意当format为TRANSLUCENT和TRANSPARENT时导航栏仍然会有一层透明层,暂不知什么原因,设置成UNKNOWN或者OPAQUE即可。

SYSTEM_UI_FLAG_LIGHT_STATUS_BAR和SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
让Bar中的Icon显示成黑色的,用于亮色主题下(需要FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS才能生效)

SYSTEM_UI_FLAG_LOW_PROFILE:
显示部分状态栏的ICON而不是全部,试验发现Q上只显示一个电源ICON(需FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS才能生效)

FLAG_TRANSLUCENT_STATUS和FLAG_TRANSLUCENT_NAVIGATION
根据源码发现,会自动带上View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN或者View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,可参考ViewRootImpl.getImpliedSystemUiVisibility方法,显示半透明的SystemBar,由SystemUI绘制Bar的半透明背景。

以上都是在ype为Application类型的Window中的测试,其他类型的Window会不同(这表示有些FLAG对某些类型的Window会没有效果),可参考DisplayPolicy.layoutWindowLw方法。

几种常见的Window对应的FLAG

  • 导航栏和状态栏都完全透明,图标可见:FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
  • 全屏模式,FLAG_FULLSCREEN,SYSTEM_UI_FLAG_HIDE_NAVIGATION,SYSTEM_UI_FLAG_IMMERSIVE_STICKY

以上都是在通过WindowManager添加Window的情境下的测试。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值