沉侵式状态栏:Translucent Bars
一、半透明状态栏
Android 4.4开始,便引入了Translucent System Bar的特性,支持设置半透明状态栏.1、values-19的styles中设置
<style name="StatusBarTheme" parent="AppBaseTheme">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
2、也可以通过代码设置
在setContentView之后
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
setTranslucentStatus(true);
}
private void setTranslucentStatus(boolean on) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
实际开发中,一般还需要将根布局的android:fitsSystemWindows="true",留出statusBar高度,避免标题栏与statusBar产生重叠。
二、statusBarColor
android5.0开始才有statusBarColor属性,支持设置状态栏颜色
1、values-21的styles中设置
<style name="StatusBarTheme" parent="AppBaseTheme">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
设置statusBarColor为transparent,是为了在代码中动态设置状态栏颜色。
注意:android:windowTranslucentStatus和android:statusBarColor只能用一个,所以如果要设置statusBarColor,需要设置windowTranslucentStatus=false
2、在代码中设置statusBarColorif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(Color.RED);
}
三、同时保证4.4和5.0效果一致
默认情况下,4.4和5.0的效果是不一致的,为了保持4.4和5.0的效果一致,我们创建一个与statusBar等高的view,添加到我们的window根布局中,用于设置状态栏颜色
Window win = activity.getWindow();
ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
View mStatusBarTintView = new View(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());
params.gravity = Gravity.TOP;
mStatusBarTintView.setLayoutParams(params);
mStatusBarTintView.setBackgroundColor(STATUS_COLOR);
decorViewGroup.addView(mStatusBarTintView);
四、SystemBarTint
SystemBarTint是一个针对沉侵式状态栏封装的开源库。通过添加一个与statusBar等高的View,用来设置状态栏颜色。
效果如下:
1、保证4.4和5.5的效果一致,可随意设置状态栏颜色
比如
2、对于图片背景,状态栏透明显示
完整代码参见 https://github.com/zhangquanit/UI_Trainings SystemBarTint