Android 沉浸式状态栏归纳

参考文章1
参考文章2

沉浸式状态栏就是将标题栏颜色与状态栏颜色设置为同一种颜色,Android不同的版本设置沉浸式方法也不大一样.

4.4时设置沉浸式状态栏方法
  1. 代码设置或者主题设置
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

主题设置,在values-v19文件夹下

<style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
    "android:windowTranslucentStatus">true
style>
  1. 这样设置以后,标题栏会上移动与状态栏重合.想要标题栏下移就得往decorView布局容器中加入一个与状态栏宽高一样的View,并且设置这个View背景与标题栏颜色一样,这样一来就能实现沉浸式的状态栏了.
// 伪代码
// 1.获取当前Activity的decorView对象, 最开始decorView中有标题栏View和内容栏View,
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
// 2.将创建的View添加到decorView中
decorView.addView(myView)
// 3.设置不为状态栏留空间
// rootView代表自己写的Activity布局解析后的View
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
// 忽略用户为childView设置的padding属性,将由系统为该View设置paddingTop属性,高度值为状态栏的高度.
ViewCompat.setFitsSystemWindows(rootView,true);
// 设置childView不在padding代表的区域中绘制.
rootView.setClipToPadding(true);

经过以上两步就能够使状态栏的背景与标题栏颜色一致了.

5.0时设置沉浸式状态栏方法
  1. 用代码的方式设置
// 首先设置状态栏的颜色
getWindow().setStatusBarColor(getResources().getColor(android.R.color.read));
// 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充,上面一步已经设置了StatusBarColor的颜色
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 最后还要清楚清除这个标记
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  1. 用主题配置的方式设置
    values-v21文件夹下面添加主题
<style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
    "android:windowTranslucentStatus">false
    "android:windowDrawsSystemBarBackgrounds">true
    "android:statusBarColor">@android:color/read
style>
6.0时设置沉浸式状态栏方法

6.0沉浸式设置的方法和5.0差不多.6.0做了一点优化,就是可以修改状态栏上的字体颜色与图标颜色.

  1. 用代码方式设置
// 首先设置状态栏的颜色
getWindow().setStatusBarColor(getResources().getColor(android.R.color.read));
// 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充,上面一步已经设置了StatusBarColor的颜色
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// 最后还要清楚清除这个标记
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 设置状态栏上字体颜色和图标颜色为浅黑色的
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  1. 用主题配置的方式设置
    values-v23文件夹下面添加主题
<style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
    "android:windowTranslucentStatus">false
    "android:windowDrawsSystemBarBackgrounds">true
    "android:statusBarColor">@android:color/holo_red_light
    
    "android:windowLightStatusBar">true
style>
布局如何延申到状态栏区域
  • 4.4时设置方法
  1. 代码设置
   getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  1. 主题设置,在values-v19文件夹下
   <style name="MDTheme" parent="Theme.Design.Light.NoActionBar">
       "android:windowTranslucentStatus">true
   style>
  • 5.0时设置方法
    // 1. 设置状态栏透明
    getWindow().setStatusBarColor(Color.TRANSPARENT)
    // 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充.
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    // 2. 视图延伸至状态栏区域,状态栏上浮于视图之上
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    // 最后还要清除这个标记
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  • 6.0时设置方法
    // 1. 设置状态栏颜色透明
    getWindow().setStatusBarColor(Color.TRANSPARENT)
    // 这个标记的意思是绘制一个背景透明的状态栏,然后用StatusBarColor中的颜色去填充,上面一步已经设置了StatusBarColor的颜色
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    // 2. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: 视图延伸至状态栏区域,状态栏上浮于视图之上
          View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR:  设置状态栏上字体颜色和图标颜色为浅黑色的
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    // 最后还要清除这个标记
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

你可能感兴趣的:(Android 沉浸式状态栏归纳)