最近要做沉浸式状态栏,公司另外一个部门的同事整理了相关内容,这里做一个记录,以备查询
沉浸式状态栏技术实现
这部分是技术实现的概述,重点看第5部分,实现建议。
1.自定义状态栏背景色(5.0)
5.0以上的应用中可以通过调用系统接口getWindow().setStatusBarColor()自定义状态栏背景色。 具体代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().setStatusBarColor(0xFFFF0000);
setContentView(R.layout.ordinary_layout);
}
这种方案中,主界面是从状态栏下方开始绘制的。 该方法不能与设置状态栏透明的方法一起使用(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS),否则状态栏会显示透明,颜色设置失效。
由于4.4及其以下的代码没有该方法,调用则会报错。如果需要兼容4.4,则需要慎用。
2 状态栏透明(4.4和5.0通用)
在Activity的onCreate方法中设置让状态栏透明的窗口属性。代码示例如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* Set translucent status bar. This has to be set before calling
* setContentView(R.layout.ordinary_layout).
* */
this.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
setContentView(R.layout.ordinary_layout);
}
注意:设置窗口属性的代码必须在setContentView()方法前调用。
设置窗口属性为WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS后,主界面的窗口是从手机屏幕的最顶端(也是就(0,0)的位置)开始绘制的,即主界面的内容占满了屏幕,状态栏的内容浮于其上。应用此属性时,应用要注意与屏幕上方留空隙,以避免主界面中文字、按键等内容叠加在状态栏下方。
可以在layout文件中添加下面属性的方法来适配状态栏的高度,从而避免主界面内容与状态栏的重叠。
android:clipToPadding="true"
android:fitsSystemWindows="true"
(注:下面这个属性是否要与android:clipToPadding="true"一起使用,有待商榷。)
该属性的作用让用户设置布局调整时是否考虑系统窗口(如状态栏)。
3 Material Theme实现自定义状态栏和标题栏背景色(5.0)
在5.0以上的版本中,可以应用Material Theme来实现自定义状态栏和标题栏的背景色。这个地方其实是跟1对应的实现方式。因该方案用主题方式实现,如果原来Activity中已使用了其他主题,则该方案不适用。具体用法如下:
在manifest.xml中添加自定义标题栏的主题。
在style.xml中定义该主题,如下:
4 自定义状态栏背景色(4.4和5.0通用)
在4.4上目前是不需要沉浸式状态栏,原生也不支持给状态栏设置颜色,但有开源库实现,这部分大家做参考用。
GITHUB上有一个开源工程,可以实现自定义状态栏背景色。其路径如下: https://github.com/jgilfelt/SystemBarTint
我们用该开源工程来实现自定义状态栏背色。具体用法如下。
(1) 将工程中com/readystatesoftware/systembartint/ SystemBarTintManager.java导入自己的工程,或者导入相应的jar包。
(2) 在onCreate()方法中先将状态栏设为透明,再调用SystemBarTintManager中的接口来设置状态栏颜色,具体代码如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* First of all, we have to set status bar to be translucent.
* */
this.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
setContentView(R.layout.custom_status_bar_color);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(R.color.statusbar_bg);
}
如上代码,设置状态栏透明后,先new一个SystemBarTintManager的对象,然后通过其对象调用setStatusBarTintResource()方法来设置自定义的颜色值。
该方案中主界面是从屏幕最顶端((0,0)处)开始绘制。