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中添加自定义标题栏的主题。

 

 <activity 
	android:name="com.company.demo.MaterialTheme"
        android:theme="@style/MaterialSystemUI"> 
</activity>

 

 在style.xml中定义该主题,如下: 

 

<style name="MaterialSystemUI" parent="@android:style/Theme.Material"> 
	<item name="android:colorPrimaryDark">@color/statusbar_bg</item> 
	<item name="android:colorPrimary">@color/actionbar_bg</item>
</style>

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值