如何建立分销网站,wordpress的登录密码,wordpress博客打开慢,个人简历 网站开发Android状态栏适配是一个老生常谈的问题#xff0c;那么我又拿出来讲了#xff0c;因为这个东西确实太重要了#xff0c;基本上每个项目都用得到。状态栏总共有几种形态。第一#xff0c;让状态栏颜色跟应用主色调一致#xff0c;布局内容不占有状态栏的位置。第二#x…Android状态栏适配是一个老生常谈的问题那么我又拿出来讲了因为这个东西确实太重要了基本上每个项目都用得到。状态栏总共有几种形态。第一让状态栏颜色跟应用主色调一致布局内容不占有状态栏的位置。第二让布局内容的顶部成为状态栏的一部分状态栏透明。第三有DrawerLayout的情况侧边栏滑出来一半侧边栏的顶部界面一半内容的顶部界面且不透明。
让状态栏颜色跟应用主色调一致布局内容不占有状态栏的位置
设置非全屏的状态栏颜色
/*** 设置不全屏内容的状态栏颜色。** param activity 需要设置的activity* param statusBarColor 状态栏颜色值* param statusBarAlpha 状态栏透明度*/
public static void setStatusBar(Activity activity, ColorInt int statusBarColor, IntRange(from 0, to 255) int statusBarAlpha) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.M) {// 6.0 支持根据状态栏颜色定制浅色和深色的文字和图标activity.getWindow().setStatusBarColor(statusBarColor);int option;if (isDarkColor(statusBarColor)) {// 深色状态栏则让状态栏文字和图标变白option View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;} else {// 浅色状态栏则让状态栏文字和图标变黑option View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_VISIBLE;}activity.getWindow().getDecorView().setSystemUiVisibility(option);} else if (Build.VERSION.SDK_INT Build.VERSION_CODES.LOLLIPOP) {// 5.xactivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);activity.getWindow().setStatusBarColor(calculateColor(statusBarColor, statusBarAlpha));} else if (Build.VERSION.SDK_INT Build.VERSION_CODES.KITKAT) {// 4.4 自己创建一个色块加到DecorViewactivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);ViewGroup decorView (ViewGroup) activity.getWindow().getDecorView();View doraStatusBarView decorView.findViewById(DORA_STATUS_BAR_VIEW_ID);if (doraStatusBarView ! null) {if (doraStatusBarView.getVisibility() View.GONE) {doraStatusBarView.setVisibility(View.VISIBLE);}doraStatusBarView.setBackgroundColor(calculateColor(statusBarColor, statusBarAlpha));} else {decorView.addView(createStatusBarView(activity, statusBarColor, statusBarAlpha));}setFitsSystemWindow(activity);} else {// 4.4 不可定制黑色状态栏无解}
}检测状态栏的颜色以确定用深色还是浅色的文字和图标
/*** 状态栏是否是深色。** param color 状态栏颜色值*/
public static boolean isDarkColor(ColorInt int color) {int gray (int) (Color.red(color) * 0.299 Color.green(color) * 0.587 Color.blue(color) * 0.114);return gray 192;
}自己创建一个和状态栏一样高度的色块。
/*** 生成一个和状态栏大小相同的矩形条。** param activity 需要设置的activity* param color 状态栏颜色值* param alpha 状态栏透明度* return 状态栏矩形条*/
private static View createStatusBarView(Activity activity, ColorInt int color, int alpha) {// 绘制一个和状态栏一样高的矩形View statusBarView new View(activity);LinearLayout.LayoutParams params new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));statusBarView.setLayoutParams(params);statusBarView.setBackgroundColor(calculateColor(color, alpha));statusBarView.setId(DORA_STATUS_BAR_VIEW_ID);return statusBarView;
}根布局设置fitsSystemWindow
private static void setFitsSystemWindow(Activity activity) {ViewGroup parent (ViewGroup) activity.findViewById(android.R.id.content);for (int i 0, count parent.getChildCount(); i count; i) {View childView parent.getChildAt(i);if (childView instanceof ViewGroup) {childView.setFitsSystemWindows(true);((ViewGroup) childView).setClipToPadding(true);}}
}获取状态栏的高度
private static int getStatusBarHeight(Context context) {int resourceId context.getResources().getIdentifier(status_bar_height, dimen, android);return context.getResources().getDimensionPixelSize(resourceId);
}计算带透明度后的颜色
private static int calculateColor(ColorInt int color, int alpha) {if (alpha 0) {return color;}float a 1 - alpha / 255f;int red color 16 0xff;int green color 8 0xff;int blue color 0xff;red (int) (red * a 0.5);green (int) (green * a 0.5);blue (int) (blue * a 0.5);return 0xff 24 | red 16 | green 8 | blue;
}让布局内容的顶部成为状态栏的一部分状态栏透明
public static void setFullScreenStatusBar(Activity activity) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.LOLLIPOP) {activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);activity.getWindow().setStatusBarColor(Color.TRANSPARENT);} else {activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}DrawerLayout设置状态栏颜色
设置DrawerLayout的状态栏一半的颜色
public static void setStatusBar(Activity activity, DrawerLayout drawerLayout, ColorInt int statusBarColor,IntRange(from 0, to 255) int statusBarAlpha) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.KITKAT) {return;}if (Build.VERSION.SDK_INT Build.VERSION_CODES.LOLLIPOP) {activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);activity.getWindow().setStatusBarColor(Color.TRANSPARENT);} else {activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);}ViewGroup contentLayout (ViewGroup) drawerLayout.getChildAt(0);View doraStatusBarView contentLayout.findViewById(DORA_STATUS_BAR_VIEW_ID);if (doraStatusBarView ! null) {if (doraStatusBarView.getVisibility() View.GONE) {doraStatusBarView.setVisibility(View.VISIBLE);}doraStatusBarView.setBackgroundColor(statusBarColor);} else {contentLayout.addView(createStatusBarView(activity, statusBarColor), 0);}if (!(contentLayout instanceof LinearLayout) contentLayout.getChildAt(1) ! null) {contentLayout.getChildAt(1).setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) contentLayout.getPaddingTop(),contentLayout.getPaddingRight(), contentLayout.getPaddingBottom());}setFitsSystemWindow(drawerLayout, contentLayout);addStatusBarView(activity, statusBarAlpha);
}设置fitsSystemWindow
private static void setFitsSystemWindow(DrawerLayout drawerLayout, ViewGroup drawerLayoutContentLayout) {ViewGroup drawer (ViewGroup) drawerLayout.getChildAt(1);drawerLayout.setFitsSystemWindows(false);drawerLayoutContentLayout.setFitsSystemWindows(false);drawerLayoutContentLayout.setClipToPadding(true);drawer.setFitsSystemWindows(false);
}添加状态栏View
/*** 添加半透明矩形条。** param activity 需要设置的 activity* param statusBarAlpha 状态栏透明度*/
private static void addStatusBarView(Activity activity, IntRange(from 0, to 255) int statusBarAlpha) {ViewGroup contentView (ViewGroup) activity.findViewById(android.R.id.content);View doraStatusBarView contentView.findViewById(DORA_STATUS_BAR_VIEW_ID);if (doraStatusBarView ! null) {if (doraStatusBarView.getVisibility() View.GONE) {doraStatusBarView.setVisibility(View.VISIBLE);}doraStatusBarView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));} else {contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));}
}