android 实现透明状态栏最简单方式

写这个的来源:公司需要实现透明状态栏,状态栏颜色随着页面切换而改变,虚拟按键不变!
OK,拿到这个需求的时候,so easy !打开github!搜索statusbar,选了这3k的statusbar! 导入项目后,

  • 在4.4上跑起来完美实现了!
  • 再拿到6.0的机子上跑,什么鬼:虚拟按键怎么把底部按钮给挡住!
    不能忍!!!!
    解决方式 :
    • 按照作者readme 修改!还是不行!修改源码,不行!!!伤心不已!

    • 开启google ,baidu模式!一堆的说改这改那的,实践后,我内心是奔溃的!还是不行!
      最后在guolin大侠这里找到方法:

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

既然需求是只变状态栏(以下方式api必须>=21)

  • 先清理掉:
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

  • 然后保留全屏的:
    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

  • 接着添加flag:
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    这样我们才能对状态栏设置颜色
    最后把调用window.setStatusBarColor(Color.TRANSPARENT);设置透明即可

对于4.4 由于没有window.setStatusBarColor(Color.TRANSPARENT);

所以只需要:window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

最后形成一个方法:

public static void setTranslucentStatus(Activity activity){
    Window window = activity.getWindow();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);
    }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
} 

然后在需要的activity或者baseActivity的

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Utils.setTranslucentStatus(this);
}

一定要在setContentView(R.layout.activity_main); 之前!调用

此方法,只对状态栏进行全屏,透明化处理,并没有涉及虚拟按键!有需要的朋友可以拿去!

你可能感兴趣的:(android 实现透明状态栏最简单方式)