【Android】APP中沉浸式状态栏的设计和实现

一、沉浸式状态栏简介

在android4.4之后,api提供了透明状态栏的实现,以及沉浸式模式的实现。根据android开发官网来说,其实并没有沉浸式状态栏一说,只有Tranlucent Bar(透明状态栏) 和Immersive Mode(沉浸模式),下面是摘自官网的内容https://developer.android.com/training/system-ui/immersive
在这里插入图片描述
在这里插入图片描述
解释:
1.沉浸式全屏模式
隐藏status bar,使屏幕全屏,让Activity接收所有的(整个屏幕的)触摸事件;
2.透明化系统栏
透明系统栏,使得布局侵入系统栏的后面,必须启动fitSystemWindows属性来调整布局,才不注意被系统栏覆盖;
下面引用一张网上的图
在这里插入图片描述
从上图可以看出,其实我们大部分情况下要求的都是要透明状态栏,而不是沉浸式模式。

二、透明状态栏的实现方法

2.1 使用style

在value-19之后的style中可以使用如下的方法

values-v19/style.xml
<style name="ImageTranslucentTheme" parent="AppTheme">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>
values-v21/style.xml
     <!--5.0以后需要把颜色设置为透明,否则导航栏默认浅灰色-->
     <style name="ImageTranslucentTheme" parent="Theme.AppComat.Light.DarkActionBar">
         <item name="android:windowTranslucentStatus">false</item>
         <item name="android:windowTranslucentNavigation">true</item>
         <item name="android:statusBarColor">@android:color/transparent</item>
     </style>

需要注意的是,添加了新的主题之后,要在最起码默认的values下面的styles中设置同名的主题,这样才能保证应用在4.4以下的设备运行不会crash。然后在activity的布局中增加android:fitSystemWindows=“true”。

2.2 android5.0以后可以使用设置状态栏的颜色来实现

该方法比之前 方法要简单很多,但是只适合应用的导航栏或者状态栏为纯色的,否则还是需要使用上面的方案。
下面是要修改的属性介绍
在这里插入图片描述
如果应用需要有toolbar,statusbar,且需要类似沉浸式模式,那么在5.0以后可以使用直接修改状态栏和toolbar颜色的方法实现,如下所示:

     <style name="AppTheme" parent="android:Theme.Materail.Light">
         <item name="android:colorPrimary">@color/colorPrimary</item>
         <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
         <item name="android:colorAccent">@color/colorAccent</item>
     </style>

注意该方法并没有真正实现,而是采用改变颜色的放来来模拟.

2.3 代码实现

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
    
    
	View decorView - getWindow().getDectorView();
	int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
			| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
	decorView.setSystemUiVisibility(option);
	getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar - getSupportActionBar();
actionBar.hide();

三、沉浸式模式

其实所谓的沉浸式模式,就是全屏模式,下面是实现方法。

    注意:该方法确实可以做到完全沉浸式,即时有虚拟导航栏。但是要注意的是,有的情况下,可能不能隐藏虚拟导航栏,所以就需要把View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION去掉,这样,虚拟导航栏还在,但是状态栏是隐藏的。

    类似浏览器的需求,全频模式和视频的全屏播放,全屏模式在有导航栏的手机上需要显示导航栏。但是全屏播放需要隐藏导航栏,所以就需要在两个模式切换的时候,重新调用设置的方法,其中的却别就是是否要隐藏虚拟导航栏。
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19){
    
    
	View decorView = getWindow().getDecorView();
	decorView.setSystemUiVisibility(
		View.SYSTEM_UI_FLAG_LAYOUT_STABLE
		| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
		| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
		| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
		| View.SYSTEM_UI_FLAG_FULLSCREEN
		| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

四、透明状态栏踩坑

如果在代码实现透明状态栏的话,可能会因为一开始设置的style不是透明的,到部分手机上会出现跳动的问题,因为页面在加载之后,整个布局区域发生了变化。代码中增加

View.SYSTEM_UI_FLAG_LAYOUT_STABLE

会有所好转,

猜你喜欢

转载自blog.csdn.net/sinat_36955332/article/details/108638668
今日推荐