1. 序言
关于沉浸式状态栏,第一反应过来的效果类似网易云音乐首页:
这个效果其实就是让背景图片利用系统状态栏的空间,从而让背景图片与状态栏融为一体。
首先我们来理解一下沉浸式的含义。
沉浸式即给用户提供完全沉浸的体验,例如看电影,玩游戏的时候充满了整个屏幕画面,没有其他因素干扰,避免了第三方因素的打扰。如果这个时候顶部出现一个状态栏,会极大的影响使用体验。
现在常说的”沉浸式“状态栏一般是指状态栏背景透明,让背景图片与状态栏融为一体,这其实并不是真正意义上的沉浸式,如鲁迅先生所言:”这世界上本没有路,走的人多了,也变成了路“。
本文先从如何实现一般意义上的”沉浸式“状态栏讲起,再实现真正意义上的沉浸式状态栏。
2. “沉浸式”状态栏实现
一个Android应用程序的界面上其实是有很多系统元素的,观察下图:
真正的沉浸式模式,应该是将这些元素都隐藏处理,这里我们先实现一般意义上的“沉浸式状态栏”创建一个空项目,修改布局,放入一个ImageView,运行程序:
这里我们想实现开头网易云音乐的那种状态栏效果的话,
修改MainActivity.java代码:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= 21) {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
运行程序:
这里运用了UI_FLAG方法,我们使用了SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
和SYSTEM_UI_FLAG_LAYOUT_STABLE
,注意两个Flag必须要结合在一起使用,表示会让应用的主体内容占用系统状态栏的空间。这里使用了setStatusBarColor()
方法,这个方法是在Android 5.0加入的,所以要做版本判断。
2.1 真正的沉浸式状态栏
前面实现的是一般意义上的沉浸式状态栏,即状态栏还在,应用布局可以占据状态栏的空间。如要要实现真正的沉浸式状态栏——隐藏状态栏。修改一下MainActivity.java代码
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
运行程序,好像隐藏了状态栏,实现了真正的沉浸式,但是一触屏就显示状态栏出来,这种情况的使用场景有限。如果要实现前面游戏界面的模式,只需要重写Activity的onWindowFocusChanged()
方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
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);
}
}
}
只有在Android 4.4及以上系统才支持沉浸式状态,所以需要加上if判断。这里就可以实现了前面游戏界面的沉浸式状态。