Android 全面屏適配及判斷是否為全面屏
阿新 • • 發佈:2019-01-08
一,全面屏的適配
全面屏出現後,如果不做適配,螢幕上會出現上下黑邊,影響視覺效果。
針對此問題,Android官方提供了適配方案,即提高App所支援的最大螢幕縱橫比,實現起來也比較簡單,在AndroidManifest.xml中做如下配置即可,在AndroidManifet裡的<application>下宣告:
<meta-data android:name="android.max_aspect"
android:value="ratio_float"/>
將ratio_float設定為2.1即可適配一眾全面屏手機,即:
<meta-data android:name="android.max_aspect" android:value="2.1" />
二,判斷是否為全面屏
很多的手機是有虛擬導航欄的,特別是華為手機,有人提議通過判斷是否含有虛擬導航欄,不就可以判斷是否為全面屏了嗎?
/** * 判斷裝置是否存在NavigationBar(虛擬導航欄) * * @return true 存在, false 不存在 */ public static boolean deviceHasNavigationBar() { boolean haveNav = false; try { //1.通過WindowManagerGlobal獲取windowManagerService // 反射方法:IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService(); Class<?> windowManagerGlobalClass = Class.forName("android.view.WindowManagerGlobal"); Method getWmServiceMethod = windowManagerGlobalClass.getDeclaredMethod("getWindowManagerService"); getWmServiceMethod.setAccessible(true); //getWindowManagerService是靜態方法,所以invoke null Object iWindowManager = getWmServiceMethod.invoke(null); //2.獲取windowMangerService的hasNavigationBar方法返回值 // 反射方法:haveNav = windowManagerService.hasNavigationBar(); Class<?> iWindowManagerClass = iWindowManager.getClass(); Method hasNavBarMethod = iWindowManagerClass.getDeclaredMethod("hasNavigationBar"); hasNavBarMethod.setAccessible(true); haveNav = (Boolean) hasNavBarMethod.invoke(iWindowManager); } catch (Exception e) { e.printStackTrace(); } return haveNav; }
通過檢驗發現,此方法並不能判斷是否為全面屏,因為全面屏的手機通過以上方法,判斷的值為:true。
因此,需要從其他方面進行判斷,全面屏與傳統屏的區別在於,螢幕的縱橫比,所以,可以從縱橫比方面做出判斷,詳細程式碼如下:
/** * 判斷是否是全面屏 */ private volatile static boolean mHasCheckAllScreen; private volatile static boolean mIsAllScreenDevice; public static boolean isAllScreenDevice(Context context) { if (mHasCheckAllScreen) { return mIsAllScreenDevice; } mHasCheckAllScreen = true; mIsAllScreenDevice = false; // 低於 API 21的,都不會是全面屏。。。 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return false; } WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); if (windowManager != null) { Display display = windowManager.getDefaultDisplay(); Point point = new Point(); display.getRealSize(point); float width, height; if (point.x < point.y) { width = point.x; height = point.y; } else { width = point.y; height = point.x; } if (height / width >= 1.97f) { mIsAllScreenDevice = true; } } return mIsAllScreenDevice; }
例如:此判斷在PopupWindow相容適配有虛擬導航欄手機和全面屏的顯示時,底部被虛擬導航欄遮蓋,或者全面屏手機下方有間隙。