沉浸式状态栏有两种方式:一:当状态栏下面是一张图片的时候,设置上面状态栏为透明,这样状态栏就会被图片覆盖(这里为方便我设置了一个button颜色为#FF4081)
首先看下没有设置沉浸式状态栏时的状态栏:
设置状态栏的颜色代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0以上 this.getWindow().setStatusBarColor(Color.RED); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //4.4 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置状态栏为透明 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//设置导航键为透明 }
结果如下图:
第二种方式:
指定状态栏为某个颜色:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { this.getWindow().setStatusBarColor(Color.BLUE); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); View statusView=createStatusBarView(Color.BLUE); ViewGroup viewGroup= (ViewGroup) getWindow().getDecorView(); viewGroup.addView(statusView); }
private View createStatusBarView(int color) { View statusBarView = new View(this); LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight()); statusBarView.setLayoutParams(params); statusBarView.setBackgroundColor(color); return statusBarView; } private int getStatusBarHeight() { int identifier = getResources().getIdentifier("status_bar_height", "dimen", "android"); return getResources().getDimensionPixelOffset(identifier); }效果如下:
这里我将方法进行了封装,完整代码:
/** * * 状态栏的实现封装类 * - 完成以下两种功能: * 1,设置一个纯色,适配4.4并以上,需要处理5.0并以上的阴影效果 * 2,当顶部是一个图片,上移到状态栏 */ public class StatusBarUtils { /** * 将acitivity中的activity中的状态栏设置为一个纯色 * @param activity 需要设置的activity * @param color 设置的颜色(一般是titlebar的颜色) */ public static void setColor(Activity activity, int color){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0及以上,不设置透明状态栏,设置会有半透明阴影 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //设置statusBar的背景色 activity.getWindow().setStatusBarColor(color); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 生成一个状态栏大小的矩形 View statusView = createStatusBarView(activity, color); // 添加 statusView 到布局中 ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); decorView.addView(statusView); //让我们的activity_main。xml中的布局适应屏幕 setRootView(activity); } } /** * 当顶部是图片时,是图片显示到状态栏上 * @param activity */ public static void setImage(Activity activity){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0及以上,不设置透明状态栏,设置会有半透明阴影 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 使activity_main.xml中的图片可以沉浸到状态栏上 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//嵌入式 //设置状态栏颜色透明。 activity.getWindow().setStatusBarColor(Color.TRANSPARENT); } else { //。。。。 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏 } } /** * 设置根布局参数,让跟布局参数适应透明状态栏 * */ private static void setRootView(Activity activity) { //获取到activity_main.xml文件 ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); //如果不是设置参数,会使内容显示到状态栏上 rootView.setFitsSystemWindows(true); } /** * 获取状态栏的高度 * @param acitivity * @return */ private static int getStatusBarHeight(Activity acitivity){ int resourceId = acitivity.getResources().getIdentifier("status_bar_height", "dimen", "android"); return acitivity.getResources().getDimensionPixelOffset(resourceId); } /** * 生成一个和状态栏大小相同的矩形条 * @param activity 需要设置的activity * @param color 状态栏颜色值 * @return 状态栏矩形条 */ private static View createStatusBarView(Activity activity, int color) { // 绘制一个和状态栏一样高的矩形 View statusBarView = new View(activity); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); statusBarView.setLayoutParams(params); statusBarView.setBackgroundColor(color); return statusBarView; } public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) { Class<? extends Window> clazz = activity.getWindow().getClass(); try { int darkModeFlag = 0; Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag); return true; } catch (Exception e) { e.printStackTrace(); } return false;}
}