Android沉浸式状态栏实现

最近要做沉浸式状态栏,公司另外一个部门的同事整理了相关内容,这里做一个记录,以备查询

 

沉浸式状态栏技术实现

这部分是技术实现的概述,重点看第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中定义该主题,如下: 

 

Android沉浸式状态栏实现_第1张图片

 

 

 

 

 

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)处)开始绘制。 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Android基础)