Android獲取虛擬按鍵的高度(適配全面屏)

在開發(fā)過程中,假如我們要從底部彈出一個(gè)popwindow,這時(shí)候我們需要考慮獲取實(shí)際顯示的虛擬鍵高度。

期望:

  • 全面屏下
    1.1 開啟全面屏開關(guān)-返回0
    1.2 關(guān)閉全面屏開關(guān)-執(zhí)行非全面屏下處理方式
  • 非全面屏下
    2.1 沒有虛擬鍵-返回0
    2.2 虛擬鍵隱藏-返回0
    2.3 虛擬鍵存在且未隱藏-返回虛擬鍵實(shí)際高度
  /**
     * 獲取虛擬按鍵的高度
     *      1. 全面屏下
     *          1.1 開啟全面屏開關(guān)-返回0
     *          1.2 關(guān)閉全面屏開關(guān)-執(zhí)行非全面屏下處理方式
     *      2. 非全面屏下
     *          2.1 沒有虛擬鍵-返回0
     *          2.1 虛擬鍵隱藏-返回0
     *          2.2 虛擬鍵存在且未隱藏-返回虛擬鍵實(shí)際高度
     */
    public static int getNavigationBarHeightIfRoom(Context context) {
        if(navigationGestureEnabled(context)){
            return 0;
        }
        return getCurrentNavigationBarHeight(((Activity) context));
    }

    /**
     * 全面屏(是否開啟全面屏開關(guān) 0 關(guān)閉  1 開啟)
     *
     * @param context
     * @return
     */
    public static boolean navigationGestureEnabled(Context context) {
        int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0);
        return val != 0;
    }

    /**
     * 獲取設(shè)備信息(目前支持幾大主流的全面屏手機(jī),親測(cè)華為、小米、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";
        }
    }

    /**
     * 非全面屏下 虛擬鍵實(shí)際高度(隱藏后高度為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,為空或者不可見時(shí)是隱藏狀態(tài)
        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;
    }```
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文/柳樹招風(fēng) 上周四九點(diǎn)左右,我媽又打電話過來,沒什么重要的事,無非又是催我要趕緊找個(gè)女朋友,絮絮叨叨一大堆,我也...
    柳樹招風(fēng)閱讀 1,012評(píng)論 7 22
  • 第一次對(duì)自己的未來這么沒有信心
    乙言閱讀 185評(píng)論 0 0
  • 輕快模版:(預(yù)計(jì)40分鐘) 一、把昨天發(fā)生的事記下來。 二、寫反思日記,反思我昨天哪件事其實(shí)可以做得更好。 1. ...
    易查理閱讀 1,231評(píng)論 0 2

友情鏈接更多精彩內(nèi)容