android4.4之前的版本,状态栏的背景色和字体颜色都不能修改。但是4.4以后Google增加了改变状态栏背景透明的方法。在6.0以后Google增加了修改字体颜色的方法。
沉浸模式
沉浸模式可理解为Activity全屏,但是状态栏覆盖显示在界面顶部。由此将存在两种需求:
(1)状态栏背景透明,覆盖在图片上
(2)状态栏背景颜色和标题栏颜色一致。
状态栏背景透明 状态栏背景色和标题栏一致沉浸模式是针对android4.4及其以上版本进行设定。
状态栏覆盖在图片上显示,我们只需要实现全屏延伸即可。而要实现状态栏颜色和标题栏颜色一致,则只需要设置状态栏颜色即可。
1、全屏延伸
全屏延伸,核心点在于状态栏设置为透明,而状态栏设置透明必须android版本不低于4.4。
为了适配android4.4以上版本,我们需要新建values-v19和values-v21,并创建文件styles.xml。
values文件夹中的styles是适配andriod4.4以下版本,即不设置状态栏透明。
状态栏设置透明有两种实现方法,一种是通过设置主题style,另一种是通过代码实现。
1.1通过设置主题style实现
values文件夹中的styles文件:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.Main" parent="AppTheme"/>
values-v19文件夹中的styles文件:
<style name="AppTheme.Main" parent="AppTheme">
<item name="android:windowTranslucentStatus">true</item>
</style>
values-v21文件夹中的styles文件:
// 5.0 以上提供了 setStatusBarColor() 方法设置状态栏颜色。
<style name="AppTheme.Main" parent="AppTheme">
<item name="android:windowTranslucentStatus">true</item>
<!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
<item name="android:windowTranslucentNavigation">true</item>
</style>
android:windowTranslucentNavigation
对应的是底部的虚拟键的背景。
1.2通过代码实现
protected void setTranslucentStatus(){
//设置5.0及其以上系统状态栏透明
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
Window window = getWindow();
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){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
setTranslucentStatus
方法在onCreate
中执行即可。
其中有一部分代码是虚拟键背景设置。
2、设置状态栏颜色(非透明)
设置状态栏颜色,android5.0以上系统可通过主题样式设置,也可通过代码设置;android4.4系统只能通过代码设置。
有些技术文档介绍的是通过设置主题style和 fitsSystemWindows 属性,从而达到android4.4系统和5.0以上系统修改状态栏颜色的目的。其实,android4.4系统并非是修改了状态栏颜色,而是现实的activity最外层的背景色。因此最外层背景色需要特别设定。个人感觉这个方法不是很实用,就记录了。毕竟怎么简单怎么来_
protected void setStatusColor(int color){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0 以上直接设置状态栏颜色
getWindow().setStatusBarColor(color);
} else {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup rootView = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
rootView.setPadding(0, getStatusBarHeight(), 0, 0);
//根布局添加占位状态栏
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
View statusBarView = new View(this);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight());
statusBarView.setBackgroundColor(color);
decorView.addView(statusBarView, lp);
}
}
protected int getStatusBarHeight(){
int result = 0;
//获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
在onCreate
方法中执行setStatusColor
方法即可。
本文主要记录如何简单实现上文的两种需求,通过代码更好的理解设置的原理。
第三方库:compile 'com.jaeger.statusbarutil:library:1.4.0'
网友评论