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

作者: 小渚 | 来源:发表于2017-04-27 22:43 被阅读705次

    写这个的来源:公司需要实现透明状态栏,状态栏颜色随着页面切换而改变,虚拟按键不变!
    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 实现透明状态栏最简单方式

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