美文网首页
沉浸式状态栏和导航栏工具,StatusBarUtil

沉浸式状态栏和导航栏工具,StatusBarUtil

作者: 十三妹儿儿儿 | 来源:发表于2019-08-27 13:40 被阅读0次

不知道是为嘛,格式总是不对,,,,先上传一下等研究研究怎么调整格式再修改吧。。。
使用的时候在相应的类里调用StatusBarUtil.init()就可以
public class StatusBarUtil {

public static int screenWidth;
public static int screenHeight;
public static int navigationHeight = 0;

private static DisplayMetrics mMetrics;
public static final String HOME_CURRENT_TAB_POSITION = "HOME_CURRENT_TAB_POSITION";

public static final String SYS_EMUI = "sys_emui";
public static final String SYS_MIUI = "sys_miui";
public static final String SYS_FLYME = "sys_flyme";
private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level";
private static final String KEY_EMUI_VERSION = "ro.build.version.emui";
private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion";

public static void init(Activity activity) {
    ViewGroup contentLayout = activity.getWindow().getDecorView().findViewById(Window.ID_ANDROID_CONTENT);
    StatusBarUtil.setStatusBar(activity, false, true);
    StatusBarUtil.setStatusTextColor(true,activity);
    StatusBarUtil.setStatusBarPadding(activity, contentLayout);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
    }
}
/**
 * 通过反射的方式获取状态栏高度
 *
 * @return
 */
public static int getStatusBarHeight(Context context) {
    try {
        Class<?> c = Class.forName("com.android.internal.R$dimen");
        Object obj = c.newInstance();
        Field field = c.getField("status_bar_height");
        int x = Integer.parseInt(field.get(obj).toString());
        return context.getResources().getDimensionPixelSize(x);
    } catch (Exception e) {
    }
    return 0;
}

/**
 * 获取底部导航栏高度
 *
 * @return
 */
public static int getNavigationBarHeight(Context context) {
    Resources resources = context.getResources();
    int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
    //获取NavigationBar的高度
    navigationHeight = resources.getDimensionPixelSize(resourceId);
    return navigationHeight;
}

//获取是否存在NavigationBar
public static boolean checkDeviceHasNavigationBar(Context context) {
    boolean hasNavigationBar = false;
    Resources rs = context.getResources();
    int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
    if (id > 0) {
        hasNavigationBar = rs.getBoolean(id);
    }
    try {
        Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
        Method m = systemPropertiesClass.getMethod("get", String.class);
        String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
        if ("1".equals(navBarOverride)) {
            hasNavigationBar = false;
        } else if ("0".equals(navBarOverride)) {
            hasNavigationBar = true;
        }
    } catch (Exception e) {

    }
    return hasNavigationBar;

}

/**
 * @param activity
 * @param useThemestatusBarColor   是否要状态栏的颜色,不设置则为透明色
 * @param withoutUseStatusBarColor 是否不需要使用状态栏为暗色调
 */
public static void setStatusBar(Activity activity, boolean useThemestatusBarColor, boolean withoutUseStatusBarColor) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上
        View decorView = activity.getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorView.setSystemUiVisibility(option);
        if (useThemestatusBarColor) {
            activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.white));
        } else {
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0
        WindowManager.LayoutParams localLayoutParams = activity.getWindow().getAttributes();
        localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !withoutUseStatusBarColor) {
        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    }
}

public static void reMeasure(Activity activity) {
    Display display = activity.getWindowManager().getDefaultDisplay();
    mMetrics = new DisplayMetrics();

    if (Build.VERSION.SDK_INT >= 17) {
        display.getRealMetrics(mMetrics);
    } else {
        display.getMetrics(mMetrics);
    }

    screenWidth = mMetrics.widthPixels;
    screenHeight = mMetrics.heightPixels;
}

/**
 * 改变魅族的状态栏字体为黑色,要求FlyMe4以上
 */
private static void processFlyMe(boolean isLightStatusBar, Activity activity) {
    WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
    try {
        Class<?> instance = Class.forName("android.view.WindowManager$LayoutParams");
        int value = instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(lp);
        Field field = instance.getDeclaredField("meizuFlags");
        field.setAccessible(true);
        int origin = field.getInt(lp);
        if (isLightStatusBar) {
            field.set(lp, origin | value);
        } else {
            field.set(lp, (~value) & origin);
        }
    } catch (Exception e) {
    }
}

/**
 * 改变小米的状态栏字体颜色为黑色, 要求MIUI6以上  lightStatusBar为真时表示黑色字体
 */
private static void processMIUI(boolean lightStatusBar, Activity activity) {
    Class<? extends Window> clazz = activity.getWindow().getClass();
    try {
        int darkModeFlag;
        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(), lightStatusBar ? darkModeFlag : 0, darkModeFlag);
    } catch (Exception e) {
    }
}

/**
 * 设置OPPO手机状态栏字体为黑色(colorOS3.0,6.0以下部分手机)
 *
 * @param lightStatusBar
 * @param activity
 */
private static final int SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT = 0x00000010;

private static void setOPPOStatusTextColor(boolean lightStatusBar, Activity activity) {
    Window window = activity.getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    int vis = window.getDecorView().getSystemUiVisibility();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (lightStatusBar) {
            vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        } else {
            vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        }
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        if (lightStatusBar) {
            vis |= SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT;
        } else {
            vis &= ~SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT;
        }
    }
    window.getDecorView().setSystemUiVisibility(vis);
}


/**
 * 判断手机是否是小米
 *
 * @return
 */
public static boolean isMIUI() {
    return SYS_MIUI.equals(getSystem());
}

/**
 * 判断手机是否是魅族
 *
 * @return
 */
public static boolean isFlyme() {
    try {
        // Invoke Build.hasSmartBar()
        final Method method = Build.class.getMethod("hasSmartBar");
        return method != null;
    } catch (final Exception e) {
        return false;
    }
}

/**
 * 设置状态栏文字色值为深色调
 *
 * @param useDart  是否使用深色调
 * @param activity
 */
public static void setStatusTextColor(boolean useDart, Activity activity) {
    if (isFlyme()) {
        processFlyMe(useDart, activity);
    } else if (isMIUI()) {
        processMIUI(useDart, activity);
    } else if (Build.MANUFACTURER.equalsIgnoreCase("OPPO")) {
        //OPPO
        setOPPOStatusTextColor(useDart, activity);
    } else {
        if (useDart) {
            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);
            }
        } else {
            activity.getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
        activity.getWindow().getDecorView().findViewById(android.R.id.content).setPadding(0, 0, 0, navigationHeight);
    }
}

/**
 * 作者:Loyea
 * 链接:https://www.jianshu.com/p/abd021c22728
 * 來源:简书
 * 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
 */
public static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
    View decor = activity.getWindow().getDecorView();
    if (dark) {
        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    } else {
        // We want to change tint color to white again.
        // You can also record the flags in advance so that you can turn UI back completely if
        // you have set other flags before, such as translucent or full screen.
        decor.setSystemUiVisibility(0);
    }
}

public static String getSystem() {
    String SYS = "";
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
        if (!TextUtils.isEmpty(getSystemProperty(KEY_MIUI_VERSION_CODE, ""))
                || !TextUtils.isEmpty(getSystemProperty(KEY_MIUI_VERSION_NAME, ""))
                || !TextUtils.isEmpty(getSystemProperty(KEY_MIUI_INTERNAL_STORAGE, ""))) {
            SYS = SYS_MIUI;//小米
        } else if (!TextUtils.isEmpty(getSystemProperty(KEY_EMUI_API_LEVEL, ""))
                || !TextUtils.isEmpty(getSystemProperty(KEY_EMUI_VERSION, ""))
                || !TextUtils.isEmpty(getSystemProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, ""))) {
            SYS = SYS_EMUI;//华为
        } else if (getMeizuFlymeOSFlag().toLowerCase().contains("flyme")) {
            SYS = SYS_FLYME;//魅族
        }
        return SYS;
    } else {
        try {
            Properties prop = new Properties();
            prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
            if (prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null
                    || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null
                    || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null) {
                SYS = SYS_MIUI;//小米
            } else if (prop.getProperty(KEY_EMUI_API_LEVEL, null) != null
                    || prop.getProperty(KEY_EMUI_VERSION, null) != null
                    || prop.getProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, null) != null) {
                SYS = SYS_EMUI;//华为
            } else if (getMeizuFlymeOSFlag().toLowerCase().contains("flyme")) {
                SYS = SYS_FLYME;//魅族
            }
        } catch (IOException e) {
            e.printStackTrace();
            return SYS;
        } finally {
            return SYS;
        }
    }
}

private static String getSystemProperty(String key, String defaultValue) {
    try {
        Class<?> clz = Class.forName("android.os.SystemProperties");
        Method get = clz.getMethod("get", String.class, String.class);
        return (String) get.invoke(clz, key, defaultValue);
    } catch (Exception e) {
    }
    return defaultValue;
}

public static String getMeizuFlymeOSFlag() {
    return getSystemProperty("ro.build.display.id", "");
}

/**
 * 全屏模式下  针对刘海屏向下移动view
 *
 * @param context
 * @param view    需要设置padding的view
 */
public static void setStatusBarPadding(Context context, View view) {
    if (view != null)
        view.setPadding(0, getStatusBarHeight(context), 0, 0);
}}

、、、
另外,还有一个比较好用的状态栏工具ImmersionBar,贴一个写的很详细的使用文档
https://www.jianshu.com/p/2a884e211a62](https://www.jianshu.com/p/2a884e211a62

相关文章

网友评论

      本文标题:沉浸式状态栏和导航栏工具,StatusBarUtil

      本文链接:https://www.haomeiwen.com/subject/xofosctx.html