使用setSystemUiVisibility适配statusb
2016-10-29 本文已影响1426人
leiiiooo
前言
- 关于沉浸式标准的定义:App默认是全屏的,用户可以从顶部或者底部“滑出”状态栏和导航栏,一段时间后状态栏和导航栏会自动消失。
setSystemUiVisibility
4.0之后,官方提供了这个方法,可以改变系统的UI可见性,使用方式如下:
int flag = View.SYSTEM_UI_FLAG_FULLSCREEN;
getWindow().getDecorView().setSystemUiVisibility(flag);
多个值可以使用"|"操作符,比如:
int flag = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
getWindow().getDecorView().setSystemUiVisibility(flag);
常见flag展示效果如下:
- SYSTEM_UI_FLAG_FULLSCREEN(4.1+):隐藏状态栏,手指在屏幕顶部往下拖动,状态栏会再次出现且不会消失,另外activity界面会重新调整大小,直观感觉就是activity高度有个变小的过程。
- SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(4.1+):配合SYSTEM_UI_FLAG_FULLSCREEN一起使用,效果使得状态栏出现的时候不会挤压activity高度,状态栏会覆盖在activity之上
- SYSTEM_UI_FLAG_HIDE_NAVIGATION(4.0+):会使得虚拟导航栏隐藏,但同样用户可以从屏幕下边缘“拖出”且不会再次消失,同时activity界面会被挤压 。
- SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION(4.1+):配合 SYSTEM_UI_FLAG_HIDE_NAVIGATION 一起使用,效果使得导航栏出现的时候不会挤压activity高度,导航栏会覆盖在activity之上。
- 使用以上四个属性,可以达到activity占据屏幕所有空间,同时状态栏和导航栏可以悬浮在activity之上的效果。但是此时activity的内容也会(比如顶部和底部各有一个TextView)状态栏和导航栏之下,当状态栏和导航栏出现的时候,看起来会这样:
显然,文字被遮盖了我们是不能接受的,此时我们需要另外一个属性,android:fitsSystemWindows=“true”,这个属性表示系统UI(状态栏、导航栏)可见的时候,会给我们的布局加上padding(paddingTop、paddingBottom)属性,这样内容就不会被盖住了。我们在activity的根布局加上这个属性,效果如下:
fitsSystemWindows以上都是4.1(除了SYSTEM_UI_FLAG_HIDE_NAVIGATION)的属性,观察之后我们发现,不管是那种属性,状态栏和导航栏总是会“遮挡”activity,为了解决这个问题,4.4引入了“全屏沉浸模式”这个概念。
- SYSTEM_UI_FLAG_IMMERSIVE(4.4+):这个属性是用来实现“沉浸式”效果的,官方称作“Immersive full-screen mode”。
SYSTEM_UI_FLAG_HIDE_NAVIGATION+SYSTEM_UI_FLAG_IMMERSIVETo provide your app with a layout that fills the entire screen, the new SYSTEM_UI_FLAG_IMMERSIVEflag for setSystemUiVisibility()(when combined with SYSTEM_UI_FLAG_HIDE_NAVIGATION) enables a new immersive full-screen mode.
- SYSTEM_UI_FLAG_IMMERSIVE_STICKY :和SYSTEM_UI_FLAG_IMMERSIVE相似,它被称作“粘性”的沉浸模式,这个模式会在状态栏和导航栏显示一段时间后,自动隐藏(你可以点击一下屏幕,立即隐藏)。同时需要重点说明的是,这种模式下,状态栏和导航栏出现的时候是“半透明”状态,效果如下 :
关于Translucent Bar
- 4.4以上实现方式,大概需要用到以下两个属性:
- windowTranslucentNavigation:application的主题加上这个属性,表示状态栏半透明,另外,会使得状态栏会悬浮在activity之上(此时,activity布局会扩展到状态栏底部(Z轴方向)):
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
为了不遮挡activity内容,需要配合另外一个属性 - android:fitsSystemWindows:使用这个属性的View,系统会在View顶部添加padding(大小为状态栏高度):
- 如果希望顶部是图片,在z轴方向上和statusbar统一维度,则不用使用fitsSystemWindows 效果如图:
- activity布局会扩展到状态栏
<item name="android:windowTranslucentStatus">true</item> - 如果你希望扩展的区域,不被状态栏盖住内容,那就加上
android:fitsSystemWindows="true" - 状态栏在4.4-5.0之间的效果是全透明,5.0+是半透明