Android 小米全面屏手势底部虚拟按键的适配
阅读原文时间:2021年04月20日阅读:1

在项目的开发过程中,发现小米部分手机有一个全面屏手势功能,该功能可隐藏底部虚拟按键,通过手势的方式来实现返回和Home功能。

效果如下所示:

当开启全面屏手势的时候,就会存在一个问题,我们通过以下代码来获取的屏幕高度

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;

获取到的屏幕高度还是包括底部虚拟按键的高度的,这个时候我们就要针对小米的全面屏做单独的适配处理。

适配处理

是否是小米手机

为了解决这个问题,首先我们要判断当前手机是否是小米手机:

Build.MANUFACTURER.equals("Xiaomi")

如果返回true是小米手机,false 不是

是否开启全面屏手势

判断出是小米手机后,需要判断当前手机是否开启了全面屏手势:

Settings.Global.getInt(context.getContentResolver(), "force_fsg_nav_bar", 0) != 0

如果返回true开启全面屏手机,false 没有

对上述两种方法进行封装处理后:

    /**
     * 判断是否是小米手机 并且是否开启全面屏
     *
     * @return
     */
    public static boolean isXiaoMi(Context context) {
        if (Build.MANUFACTURER.equals("Xiaomi")) {
            return Settings.Global.getInt(context.getContentResolver(), "force_fsg_nav_bar", 0) != 0;
        }
        return false;
    }

判断是否开启全面屏后,只需要获取底部导航栏的高度,然后,在获取屏幕高度的时候,根据不同的手机设备,动态的设置屏幕的宽高,如果是小米手机且开启全面屏,加上底部导航栏高度即可。

获取底部导航栏高度

/**
     * 获取底部虚拟按键高度
     * @param context
     * @return
     */
    public static int getNavigationBarHeight(Context context) {
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        try {
            @SuppressWarnings("rawtypes")
            Class c = Class.forName("android.view.Display");
            @SuppressWarnings("unchecked")
            Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
            method.invoke(display, dm);
            return dm.heightPixels - display.getHeight();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

真实的屏幕高度:

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int height = metrics.heightPixels;
        if (isXiaoMi(activity)) {
            height += getNavigationBarHeight(activity);
        }

通过上述方法,即可获取到真实的屏幕高度。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章