您的位置:首页 > 移动开发 > Android开发

Android 状态栏(StatusBar)和虚拟键(NavigationBar)的一些设置

2016-11-04 15:01 447 查看

最近写项目想写跟IOS一样的沉浸式模式,在写项目中用到的知识在这里记录一下(这个必须要在4.0以上的系统才能有效)

首先弄明白的是什么是StatusBar ,什么是NavigationBar 。用一张图来说明一下

状态栏(StatusBar)



.

.

.

虚拟键(NavigationBar)



StatusBar和NavigationBar的统称为SystemBar

StatusBar与NavigationBar的控制方法如下

View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE//状态栏(StatusBar)和虚拟键(NavigationBar)都显示
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);//页面到最顶部,状态栏不会隐藏,页面处于状态栏(StatusBar)的下面


上面的setSystemUiVisibility这个方法是控制SystemBar状态的显示 隐藏 。其中setSystemUiVisibility中的参数(常用参数)的作用如下:

INVISIBLE  状态栏(StatusBar)隐藏

SYSTEM_UI_FLAG_VISIBLE :状态栏(StatusBar)和虚拟键(NavigationBar)都显示,不全屏

SYSTEM_UI_FLAG_HIDE_NAVIGATION  //隐藏虚拟按钮(NavigationBar),当页面滑动时候会重新出现

SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //让页面在虚拟按钮(NavigationBar)的下面,虚拟按钮会挡住页面

SYSTEM_UI_FLAG_FULLSCREEN  //状态栏(StatusBar)会被隐藏,页面到屏幕最顶部

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //页面到最顶部,状态栏不会隐藏,页面处于状态栏(StatusBar)的下面

SYSTEM_UI_FLAG_LOW_PROFILE  //状态栏(StatusBar)和虚拟键
(NavigationBar)显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。


注:设置多个标志位时要用 | 连接起来,不能多次调用 setSystemUiVisibility。不同的组合SystemBar会有不同的效果

当能控制SystemBar的状态后,接下来设置SystemBar的背景颜色(setStatusBarColor这个方法只有在5.0以上的版本在会有。在5.0以上的版本的状态栏StatusBar有颜色的,所以用setStatusBarColor设置状态栏的颜色)

if (android.os.Build.VERSION.SDK_INT >= 21) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//让NavigationBar也为透明颜色
getWindow().setStatusBarColor(Color.TRANSPARENT);//状态栏(StatusBar)背景设置颜色
} else if (android.os.Build.VERSION.SDK_INT >= 14) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏(StatusBar)
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//让NavigationBar也为透明颜色
}else {
//在4.0以下就没有setSystemUiVisibility这个方法(隐藏状态栏(StatusBar))
}


上面我把//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)这个方法给屏蔽了,是因为在设置这个flags后NavigationBar处于透明状态,但是会覆盖在页面上,会挡住页面。目前还没有找到方法处理这个问题

还有要提到的是SystemBar的监听方法

View decorView = getWindow().getDecorView();
decorView .setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if (visibility == 0) {
// SystemBar 处于显示状态
} else {
// SystemBar 处于隐藏状态
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: