美文网首页Android开发Android全集
View.setSystemUiVisibility(int)参

View.setSystemUiVisibility(int)参

作者: littlefogcat | 来源:发表于2019-08-10 12:17 被阅读0次

    在开发透明状态栏的时候,会使用到这段代码(来自郭霖的博客):

    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();
    

    会用是知其然,但是要知其所以然。那么,这个setSystemUiVisibility方法传入的这个参数,到底起到什么作用呢?

    • SYSTEM_UI_FLAG_FULLSCREEN
      全屏模式,占据整个屏幕,隐藏状态栏等界面,不过导航栏不会隐藏。如果用户进行操作,隐藏的系统界面会立马出现并清除该flag。

      SYSTEM_UI_FLAG_FULLSCREEN
    • SYSTEM_UI_FLAG_HIDE_NAVIGATION
      隐藏导航栏,布局会往下移。如果用户进行操作,导航栏会立马出现并清除该flag。

      SYSTEM_UI_FLAG_HIDE_NAVIGATION
    • SYSTEM_UI_FLAG_IMMERSIVE
      和SYSTEM_UI_FLAG_HIDE_NAVIGATION共同使用,使用户操作不再显示导航栏(但是仍能通过从底部往上滑调出并清除flag)。单独使用无效。

    • SYSTEM_UI_FLAG_IMMERSIVE_STICKY
      和SYSTEM_UI_FLAG_FULLSCREEN以及SYSTEM_UI_FLAG_HIDE_NAVIGATION共同使用。用户操作不再清除flag,从边缘滑入可以调出状态栏和导航栏,并且过几秒之后自动隐藏。单独使用无效。

      SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN
    • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
      不隐藏状态栏和导航栏,但是app会按照已经隐藏了那样布局。也就是说,布局会顶上去(占满屏幕),但是会被状态栏/导航栏遮盖住。


      可以看到,最下面那行字被遮住了
    • SYSTEM_UI_FLAG_LAYOUT_STABLE
      布局变的“稳定”,在状态栏或者导航栏变化的时候不会被顶上去或者顶下去了。
      事实上,当同时设置了SYSTEM_UI_FLAG_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE之后,效果相当于SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN。
    • SYSTEM_UI_FLAG_LOW_PROFILE
      使系统界面不那么“显眼”,用于沉浸式体验。会使状态栏、导航栏等系统UI变暗。

    回过头再看开始的代码

    uper.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();
    

    在普通情况下,整个手机界面从上到下依次是:状态栏、appUI、虚拟导航栏。当设置了SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION和SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN两个flag之后,实际上appUI已经占到了整个屏幕,但是被状态栏和导航栏覆盖在下层。


    图示

    这时,再设置状态栏和导航栏的颜色为透明,即可实现透明状态栏/沉浸式的效果了。当知道了这些flag的作用之后,要实现其他效果也是很轻松了。比如看视频的时候,就可以设置SYSTEM_UI_FLAG_IMMERSIVE_STICKY | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN,就可以实现全屏沉浸式观看的效果了。

    相关文章

      网友评论

        本文标题:View.setSystemUiVisibility(int)参

        本文链接:https://www.haomeiwen.com/subject/mqeljctx.html