@[toc]
#1 概念:
变色状态栏(透明状态栏):指的是状态栏与导航栏颜色相同,或者透明
沉浸式状态栏:,状态栏隐藏,在手指做了相关操作后,状态栏显示出来,例如视频播放器,在播放视频时是隐藏状态栏的,但是点击屏幕的时候,状态栏会显示出来,再例如文本阅读器,在阅读的时候是全屏的,然后从屏幕上方下滑或者下方上划,虚拟键和状态栏出现了,但却是直接覆盖在程序文字上的,这是所谓的沉浸式状态栏。
#2 效果图
(1)透明效果:
a. android 4.4以下不起作用(注意兼容):
b. 4.4和5.0以上(5.0以上要调用另外的标记重新设置Flag,不然状态栏会有灰色的透明阴影效果)
(2)修改状态栏字体颜色(6.0以下不起效果,不能直接设置,而是通过两种模式,魅族、小米有对应暴露方法,但本文得考虑所有机型)
修改之后:
#3Demo地址:
http://download.csdn.net/detail/baopengjian/9806226
#4 代码:
(1)布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
tools:context="transparentstatus.pbj.net.transparentstatus.MainActivity">
<View
android:id="@+id/status_bar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@android:color/holo_red_light" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/status_bar"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="根布局为RelativeLayout时设置status_bar背景" />
<Button
android:onClick="changeColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改status_bar颜色" />
<Button
android:onClick="goLinerLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转LinearLayout根布局" />
<Button
android:onClick="changeMode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_blue_light"
android:text="修改Mode" />
</LinearLayout>
</RelativeLayout>
(2)工具类
/**
* 设置状态栏透明工具类
* Created by baopengjian on 2017/4/7.
*/
public class UtilsStyle {
/**
* 布局中必须有一个id为status_bar的view来设置状态栏背景
* 必须要在 setContentView之后调用
* onCrete中,onContentChange之前
* @param activity 当前页面
*/
public static void setTranslateStatusBar(Activity activity) {
// 4.4以上处理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // android
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 状态栏透明
View status_bar = activity.findViewById(R.id.status_bar);// 标题栏id
if (status_bar != null) {
ViewGroup.LayoutParams params = status_bar.getLayoutParams();
params.height = getStatusBarHeight(activity);
status_bar.setLayoutParams(params);
}
}
//5.0 以上处理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.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);
}
}
private static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height",
"dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* Flag只有在使用了FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
* 并且没有使用 FLAG_TRANSLUCENT_STATUS的时候才有效,也就是只有在状态栏全透明的时候才有效。
* @param activity
* @param bDark
*/
public static void setStatusBarMode(Activity activity, boolean bDark) {
//6.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
View decorView = activity.getWindow().getDecorView();
if (decorView != null) {
int vis = decorView.getSystemUiVisibility();
if (bDark) {
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
decorView.setSystemUiVisibility(vis);
}
}
}
}
(3)使用
public class MainActivity extends AppCompatActivity {
private boolean isRed = true;
private boolean isDarkMode = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注意使用位置在setContentView后,onContentChange之前
UtilsStyle.setTranslateStatusBar(this);
}
public void changeColor(View v){
View status_bar = findViewById(R.id.status_bar);
if(isRed){
status_bar.setBackgroundResource(android.R.color.holo_blue_light);
}else{
status_bar.setBackgroundResource(android.R.color.holo_red_light);
}
isRed = !isRed;
}
public void goLinerLayout(View v){
startActivity(new Intent(MainActivity.this,LinearRootActivity.class));
}
public void changeMode(View v){
UtilsStyle.setStatusBarMode(this,!isDarkMode);
isDarkMode = !isDarkMode;
}
}