android沉浸式状态栏

来源:互联网 发布:国家省市区数据库 编辑:程序博客网 时间:2024/05/19 17:10

android沉浸式状态栏

public class StatusBarUtil {    /**     * 沉浸式状态栏     *     * @param activity     * @param isLightStatusBar 是否为浅色状态栏(黑色字体图标)     * @param isTransStatusBar 是否为透明状态栏     */    public static void initStatusBar(Activity activity, boolean isLightStatusBar, boolean isTransStatusBar) {        // 6.0以上        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            // 设置浅色状态栏(神色背景图标)            StatusBarUtil.StatusBarLightMode(activity, isLightStatusBar);            // 透明状态栏            if (isTransStatusBar) {                StatusBarUtil.setTransStatusBar(activity, isLightStatusBar);            }        }    }    /**     * 透明状态栏     *     * @param isLightStatusBar 浅色状态栏(黑色字体、图标)     */    private static void setTransStatusBar(Activity activity, boolean isLightStatusBar) {        // 大于android 5.0        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);            // 大于 android 6.0            if (isLightStatusBar && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                // 6.0增加了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,这个字段就是把状态栏标记为浅色,然后状态栏的字体颜色自动转换为深色。                // 所以,如果需要浅色的状态栏,只能在Android6.0及以后的版本中实现                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE                        | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);            } else {                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);            }            // 透明状态栏            // FLAG_TRANSLUCENT_STATUS 只是把状态栏设置为透明的,但是,状态栏是有背景色的,一些手机的状态栏背景色为透明,而一些手机的状态栏背景色为半透明的黑色            // 于是在5.0上增加了WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS            // getWindow().setStatusBarColor(int color)            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            window.setStatusBarColor(Color.TRANSPARENT);        }    }    /**     * 设置状态栏黑色字体图标,     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android     *     * @param activity     * @param dark     是否把状态栏字体及图标颜色设置为深色     * @return 1:MIUUI 2:Flyme 3:android6.0     */    private static int StatusBarLightMode(Activity activity, boolean dark) {        int result = 0;        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            if (MIUISetStatusBarLightMode(activity.getWindow(), dark)) {                result = 1;            } else if (FlymeSetStatusBarLightMode(activity.getWindow(), dark)) {                result = 2;            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);                result = 3;            }        }        return result;    }    /**     * 设置状态栏图标为深色和魅族特定的文字风格     * 可以用来判断是否为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;    }}
原创粉丝点击