沉浸式

沉浸式就是利用系统状态栏,将背景图片延伸至系统状态栏区域内,效果就是和游戏应用画面那样。

Action1 隐藏状态栏和ActionBar

仅仅是隐藏状态栏和ActionBar,只是粗暴的隐藏了而已

//获取当前界面的DecorView
    View decorView = getWindow().getDecorView();
    //表示全屏,即隐藏状态栏
    int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
    //设置系统UI元素可见性
    decorView.setSystemUiVisibility(option);
    ActionBar actionBar = getSupportActionBar();
    //隐藏ActionBar
    actionBar.hide();

Action2 透明状态栏

透明状态栏效果:背景图片延伸,而非隐藏。需要借助其他的UI Flag,且需要判断版本

    //5.0以上才支持
    if (Build.VERSION.SDK_INT>=21){
        View decorView = getWindow().getDecorView();
        //这两个Flag结合使用,才会让应用的主体内容占据系统状态栏的空间
        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();

至此,尚不能称为沉浸式状态栏,只能算是透明状态栏

Action3 隐藏导航栏

隐藏系统底部导航栏,需要设置UI FLAG。
缺陷:只要点击屏幕,就会退出该模式

	View decorView = getWindow().getDecorView();
    int option = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    decorView.setSystemUiVisibility(option);
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();

Action4 综上

结合3种UI Flag,已经和真正的沉浸式很接近了

  //5.0以上才支持
    if (Build.VERSION.SDK_INT>=21){
        View decorView = getWindow().getDecorView();
        //3种Flag结合使用
        int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
        decorView.setSystemUiVisibility(option);
        //将状态栏设置为透明色
        getWindow().setStatusBarColor(Color.TRANSPARENT);
        //将系统底部导航栏设置为透明色
        getWindow().setNavigationBarColor(Color.TRANSPARENT);
    }
    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN这种UI Flag,会让应用的主体内容延伸进入系统底部导航栏的空间
沉浸式

最后,真正的沉浸式

游戏、视频类应用会用到沉浸式,如爱奇艺、海岛奇兵。
在使用沉浸式的Activity中重写onWindowFocusChanged方法,并设置一下UI Flag

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus && Build.VERSION.SDK_INT>=19){
        View decorView = getWindow().getDecorView();
        int option = 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;
        decorView.setSystemUiVisibility(option);
    }
}

另外在清单文件中将该Activity设置为横屏

<activity android:name=".immersion.ImmersionActivity"
    android:screenOrientation="landscape">
</activity>

此时默认情况下全屏,不显示系统底部导航栏和状态栏。横屏模式下,顶部下拉或右侧下拉,系统底部导航栏和状态栏又会重新显示。点击屏幕或等待一段时间后无操作,就会重新进入沉浸式。
沉浸式

感谢郭婶:https://blog.csdn.net/guolin_blog/article/details/51763825

上一篇:iOS导航栏-导航栏透明


下一篇:Android事件机制