Android控件——“沉浸式“状态栏实现(StatusBar)(上)

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_FULLSCREENSYSTEM_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判断。这里就可以实现了前面游戏界面的沉浸式状态。

猜你喜欢

转载自blog.csdn.net/weixin_43499030/article/details/90415592
今日推荐