沉迷式状态栏的封装用

作者 : 开心源码 本文共5673个字,预计阅读时间需要15分钟 发布时间: 2022-05-12 共241人阅读

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

  1. 控制状态栏颜色,使状态栏和标题栏颜色相同或者者相近。达到合二为一的效果。

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

如何控制状态栏:

??在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解压,如遇到无法解压的请联系管理员
开心源码网 » 沉迷式状态栏的封装用

发表回复