沉迷式状态栏的封装用
??随着使用户要求的不断提高,Android版本的不断更新,沉迷式状态栏似乎已经成为了每个App的必备功能。
??首先要实现它我们得先了解他,状态栏不同于标题栏,状态栏是Android手机自带的,显示少量Android内置的信息。正常情况下位于我们标题栏上方,以黑色居多。我们的标题栏多数是不会用黑色标题的,所以,假如不控制状态栏的颜色,就是和我们的标题栏有显著的色彩差。
??在笔者的用中,沉迷式状态栏分为两种:
控制状态栏颜色,使状态栏和标题栏颜色相同或者者相近。达到合二为一的效果。

使我们开发部分顶进状态栏,与状态栏重合。这种方式多使用于图片背景。

如何控制状态栏:
??在Android中使用Window类管理状态栏,我们将固定方法封装为StatusBarUtil。我们的需求是实现沉迷式状态栏,并且我们同样不希望没个页面都要我们手动去设置一次,所以我们将在BaseActivity中实现。??首先我们得现将状态栏设置为全透明,这样,我们的第二种状态栏方式就实现了,放上图片会发现,图片会顶入状态栏中。
??而后继续获取页面首层layout,设置cliptoPadding和fitsSystemWindows属性为true,使得开发页面和状态栏分开不重合,设置颜色为颜色为标题栏颜色。至此第一种状态栏方式也实现了。
private void isChangeStatusBar(boolean isChange){ if (isChange){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { StatusBarUtil.transparencyBar(this);//设置全透明 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); try { ViewGroup layout = findViewById(R.id.layout_total); layout.setClipToPadding(true); layout.setFitsSystemWindows(true); layout.setBackgroundColor(getResources().getColor(R.color.titleViewBackgroundColor)); }catch (Exception e){ showLogError("该Activity没有为首层Layout增加id--layout_total,无法管理状态栏。"); } } } }<?xml version="1.0" encoding="utf-8"?><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/layout_total" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" >附上StatusBarUtil代码:
/** * 使用来管理手机状态栏一系列操作,主要是就Window类的用 */public class StatusBarUtil { /** * 修改状态栏为全透明 * * @param activity */ @TargetApi(19) public static void transparencyBar(Activity activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //api21新添加接口 window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Window window = activity.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } /** * 修改状态栏颜色,支持4.4以上版本 * * @param activity * @param colorId */ public static void setStatusBarColor(Activity activity, int colorId) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.setStatusBarColor(activity.getResources().getColor(colorId)); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //用SystemBarTint库使4.4版本状态栏变色,需要先将状态栏设置为透明 transparencyBar(activity); SystemBarTintManager tintManager = new SystemBarTintManager(activity); tintManager.setStatusBarTintEnabled(true); tintManager.setStatusBarTintResource(colorId); } } /** * 设置状态栏黑色字体图标, * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其余Android * * @param activity * @return 1:MIUUI 2:Flyme 3:android6.0 */ public static int statusBarLightMode(Activity activity) { int result = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (MIUISetStatusBarLightMode(activity.getWindow(), true)) { result = 1; } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) { result = 2; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { activity.getWindow().getDecorView(). setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); result = 3; } } return result; } /** * 已知系统类型时,设置状态栏黑色字体图标。 * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其余Android * * @param activity * @param type 1:MIUUI 2:Flyme 3:android6.0 */ public static void statusBarLightMode(Activity activity, int type) { if (type == 1) { MIUISetStatusBarLightMode(activity.getWindow(), true); } else if (type == 2) { FlymeSetStatusBarLightMode(activity.getWindow(), true); } else if (type == 3) { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } } /** * 清理MIUI或者flyme或者6.0以上版本状态栏黑色字体 */ public static void statusBarDarkMode(Activity activity, int type) { if (type == 1) { MIUISetStatusBarLightMode(activity.getWindow(), false); } else if (type == 2) { FlymeSetStatusBarLightMode(activity.getWindow(), false); } else if (type == 3) { activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } } /** * 设置状态栏图标为深色和魅族特定的文字风格 * 可以使用来判断能否为Flyme使用户 * * @param window 需要设置的窗口 * @param dark 能否把状态栏字体及图标颜色设置为深色 * @return boolean 成功执行返回true */ private static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { try { WindowManager.LayoutParams lp = window.getAttributes(); Field darkFlag = WindowManager.LayoutParams.class .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); Field meizuFlags = WindowManager.LayoutParams.class .getDeclaredField("meizuFlags"); darkFlag.setAccessible(true); meizuFlags.setAccessible(true); int bit = darkFlag.getInt(null); int value = meizuFlags.getInt(lp); if (dark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); result = true; } catch (Exception e) { } } return result; } /** * 设置状态栏字体图标为深色,需要MIUIV6以上 * * @param window 需要设置的窗口 * @param dark 能否把状态栏字体及图标颜色设置为深色 * @return boolean 成功执行返回true */ private static boolean MIUISetStatusBarLightMode(Window window, boolean dark) { boolean result = false; if (window != null) { Class clazz = window.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); if (dark) { extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 } else { extraFlagField.invoke(window, 0, darkModeFlag);//清理黑色字体 } result = true; } catch (Exception e) { } } return result; }}说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 沉迷式状态栏的封装用
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 沉迷式状态栏的封装用