Android 状态栏,系统底部导航栏的隐藏和颜色切换

前言:
本篇博文所用主题样式

<style name="Theme.HealCode" parent="Theme.AppCompat.Light.NoActionBar">
</style>

1.状态栏

最上面这一行显示电池、时钟、wifi等图标是状态栏。
statusBarColor和colorPrimaryDark都可以改变状态栏的颜色,它们的区别就是如果两者都使用的话statusBarColor会覆盖colorPrimaryDark,statusBarColor的优先级高些。
改变状态栏背景颜色

1.1 黑底白字

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(Color.BLACK);
        }

1.2 白底黑字

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setStatusBarColor(Color.WHITE);
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }

1.3 图片延申入状态栏和底部导航栏

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }

2. 系统底部导航栏

Android 系统底部导航方式可以分为三指导航和手势导航。
上图最下面的这个有三个按钮的是系统底部导航栏。如今的手机系统默认都是手势导航,当然在设置里可以切换成三指导航。改变navigationBarColor就可以改变底部导航栏的颜色。

3. 透明状态栏

 getWindow().setStatusBarColor(Color.TRANSPARENT);

4. 透明导航栏

getWindow().setNavigationBarColor(Color.TRANSPARENT);

5. 沉浸式

整个页面都是图片,隐藏状态栏和底部导航栏。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        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);

//使图片延申至刘海屏内,解决隐藏状态栏黑边问题
        if (Build.VERSION.SDK_INT >= 28) {
            WindowManager.LayoutParams params = getWindow().getAttributes();
            params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            getWindow().setAttributes(params);
        }
    }

    @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);
        }
    }


}

6. 隐藏状态栏

    public void fullScreenMode() {
        Window window = getWindow();
        window.getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            window.setNavigationBarColor(Color.TRANSPARENT);
            window.setStatusBarColor(Color.TRANSPARENT);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            getWindow().setAttributes(lp);
        }
    }

7. 小结:

  1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。
  2. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
  3. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏顶部状态栏和虚拟导航栏,需要和View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION、View.SYSTEM_UI_FLAG_FULLSCREEN连用,不然会状态栏会变成白色或黑色,改变statusBarColor亦无用。

参考:
https://blog.csdn.net/guolin_blog/article/details/51763825
https://blog.csdn.net/guolin_blog/article/details/103112795
https://blog.csdn.net/guolin_blog/article/details/125234545

posted @ 2022-06-30 22:31  我的小鱼干嘞  阅读(7134)  评论(0编辑  收藏  举报