美文网首页Android开发
Android获取虚拟按键的高度(适配全面屏)

Android获取虚拟按键的高度(适配全面屏)

作者: 节庆007 | 来源:发表于2019-01-08 10:14 被阅读2283次

    在开发过程中,假如我们要从底部弹出一个popwindow,这时候我们需要考虑获取实际显示的虚拟键高度。

    期望:

    • 全面屏下
      1.1 开启全面屏开关-返回0
      1.2 关闭全面屏开关-执行非全面屏下处理方式
    • 非全面屏下
      2.1 没有虚拟键-返回0
      2.2 虚拟键隐藏-返回0
      2.3 虚拟键存在且未隐藏-返回虚拟键实际高度
      /**
         * 获取虚拟按键的高度
         *      1. 全面屏下
         *          1.1 开启全面屏开关-返回0
         *          1.2 关闭全面屏开关-执行非全面屏下处理方式
         *      2. 非全面屏下
         *          2.1 没有虚拟键-返回0
         *          2.1 虚拟键隐藏-返回0
         *          2.2 虚拟键存在且未隐藏-返回虚拟键实际高度
         */
        public static int getNavigationBarHeightIfRoom(Context context) {
            if(navigationGestureEnabled(context)){
                return 0;
            }
            return getCurrentNavigationBarHeight(((Activity) context));
        }
    
        /**
         * 全面屏(是否开启全面屏开关 0 关闭  1 开启)
         *
         * @param context
         * @return
         */
        public static boolean navigationGestureEnabled(Context context) {
            int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0);
            return val != 0;
        }
    
        /**
         * 获取设备信息(目前支持几大主流的全面屏手机,亲测华为、小米、oppo、魅族、vivo都可以)
         *
         * @return
         */
        public static String getDeviceInfo() {
            String brand = Build.BRAND;
            if(TextUtils.isEmpty(brand)) return "navigationbar_is_min";
    
            if (brand.equalsIgnoreCase("HUAWEI")) {
                return "navigationbar_is_min";
            } else if (brand.equalsIgnoreCase("XIAOMI")) {
                return "force_fsg_nav_bar";
            } else if (brand.equalsIgnoreCase("VIVO")) {
                return "navigation_gesture_on";
            } else if (brand.equalsIgnoreCase("OPPO")) {
                return "navigation_gesture_on";
            } else {
                return "navigationbar_is_min";
            }
        }
    
        /**
         * 非全面屏下 虚拟键实际高度(隐藏后高度为0)
         * @param activity
         * @return
         */
        public static int getCurrentNavigationBarHeight(Activity activity){
            if(isNavigationBarShown(activity)){
                return getNavigationBarHeight(activity);
            } else{
                return 0;
            }
        }
    
        /**
         * 非全面屏下 虚拟按键是否打开
         * @param activity
         * @return
         */
        public static boolean isNavigationBarShown(Activity activity){
            //虚拟键的view,为空或者不可见时是隐藏状态
            View view  = activity.findViewById(android.R.id.navigationBarBackground);
            if(view == null){
                return false;
            }
            int visible = view.getVisibility();
            if(visible == View.GONE || visible == View.INVISIBLE){
                return false ;
            }else{
                return true;
            }
        }
    
        /**
         * 非全面屏下 虚拟键高度(无论是否隐藏)
         * @param context
         * @return
         */
        public static int getNavigationBarHeight(Context context){
            int result = 0;
            int resourceId = context.getResources().getIdentifier("navigation_bar_height","dimen", "android");
            if (resourceId > 0) {
                result = context.getResources().getDimensionPixelSize(resourceId);
            }
            return result;
        }```
    

    相关文章

      网友评论

        本文标题:Android获取虚拟按键的高度(适配全面屏)

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