1. 程式人生 > >小米獲取螢幕高度不準確-小米獲取螢幕高度的相容方案

小米獲取螢幕高度不準確-小米獲取螢幕高度的相容方案

今天發現,小米8手機獲取螢幕高度的方法不準確,進過一些測試以後發現是虛擬導航按鍵出了問題。

這裡獲取螢幕高度的方法用的是

public static int getScreenHeight(Activity activity) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int height = dm.heightPixels;
        return height;
    }

我們知道這個方法獲取螢幕高度的時候

1.當螢幕有虛擬按鍵的情況下,獲取的是螢幕頂部到虛擬按鍵上部的距離。

2.當螢幕沒有虛擬按鍵的情況下,獲取的是螢幕頂部到螢幕底部的距離。

因為我們的頁面元素一般不希望被虛擬按鍵遮擋,所以這個方法一般是我們所希望的。

但是經過測試,小米8手機在虛擬按鍵未設定的情況下,依然返回的是情況1的高度。這樣返回的高度實際缺少了虛擬按鍵的高度。

根據查閱資料,我猜測是因為獲取虛擬按鍵狀態的系統方法在小米系統內不能正常使用,導致這個獲取螢幕高度的方法認為虛擬按鍵是開啟狀態。(因為懶,所以沒去深究原始碼)。

既然知道了原因,接下來就是去解決了。

直接上程式碼

獲取高度的方法

     /**
     * 獲取螢幕高度
     *
     * @param activity
     * @return
     */
    public static int getScreenHeight(Activity activity) {
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int height = dm.heightPixels;
        return height+BottomBtnUtils.getMiSupplementHeight(activity);
    }

獲取需要補充的高度

/**
     * 獲取需要補充的高度
     * @param context
     * @return
     */
    public static int getMiSupplementHeight(Context context) {
        int result = 0;
        //是否是小米系統,不是小米系統則不需要補充高度
        if(MiUtils.isMIUI()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
                    && Settings.Global.getInt(context.getContentResolver(), "force_fsg_nav_bar", 0) == 0) {
                //如果虛擬按鍵已經顯示,則不需要補充高度
            } else {
                //如果虛擬按鍵沒有顯示,則需要補充虛擬按鍵高度到螢幕高度
                Resources res = context.getResources();
                int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
                if (resourceId > 0) {
                    result = res.getDimensionPixelSize(resourceId);
                }
            }
        }

        return result;
    }