您好,登錄后才能下訂單哦!
怎么在Android中獲取的屏幕的尺寸?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
一、底部沒有虛擬按鍵
這里獲取到的寬高,就是你眼睛能看到的,屏幕亮著的地方的寬高。
/** * 獲取屏幕的寬 * * @param context * @return */ public static int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(dm); return dm.widthPixels; } /** * 獲取屏幕的高度 * * @param context * @return */ public static int getScreenHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(dm); return dm.heightPixels; }
二、底部有虛擬按鍵
華為手機底部都會有一個黑色的虛擬按鍵(NavigationBar),通過上面這個方式得到的屏幕高度是屏幕真是高度-虛擬按鍵的高度。所以有虛擬按鍵的情況獲取屏幕的高度就是另一種方法了。
public static int getRealHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int screenHeight = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { DisplayMetrics dm = new DisplayMetrics(); display.getRealMetrics(dm); screenHeight = dm.heightPixels; //或者也可以使用getRealSize方法 // Point size = new Point(); // display.getRealSize(size); // screenHeight = size.y; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { try { screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display); } catch (Exception e) { DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); screenHeight = dm.heightPixels; } } return screenHeight; }
虛擬按鍵高度
虛擬按鍵(NavigationBar)高度可以通過讀取定義在Android系統尺寸資源中的 navigation_bar_height 獲得。
所以不管虛擬按鍵是顯示還是隱藏,得到的結果都是一樣的。
public static int getNavigationBarHeight(Context context) { int navigationBarHeight = -1; Resources resources = context.getResources(); int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android"); if (resourceId > 0) { navigationBarHeight = resources.getDimensionPixelSize(resourceId); } return navigationBarHeight; }
狀態欄高度
狀態欄就是屏幕頂部顯示時間,電池,wifi 等信息的欄目。
方法一:系統提供了一個Resource類,通過這個類可以獲取資源文件,借此可以獲取 到status_bar_height 。
public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }
方法2: 通過放射
Android的所有資源都會有惟一標識在R類中作為引用。我們也可以通過反射獲取R類的實例域,然后找 status_bar_height。
public void getStatusBarHeightByReflect() { int statusBarHeight2 = -1; try { Class<?> clazz = Class.forName("com.android.internal.R$dimen"); Object object = clazz.newInstance(); int height = Integer.parseInt(clazz.getField("status_bar_height") .get(object).toString()); statusBarHeight2 = getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } Log.e(TAG, "狀態欄高度-反射方式:" + statusBarHeight2); }
借助應用區 top 屬性。
狀態欄位于屏幕的最頂端,坐標從 (0,0) 開始,所以應用區的頂部的位置就是狀態欄的高度。
/** * 應用區的頂端位置即狀態欄的高度 * *注意*該方法不能在初始化的時候用 * */ public void getStatusBarHeightByTop() { Rect rectangle = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle); Log.e(TAG, "狀態欄高度-應用區頂部:" + rectangle.top); }
應用區域高度
除去狀態欄剩下的都時應用區。由此可知屏幕的高度 - 狀態欄高度 = 應用區的高度。
/** * 不能在 onCreate 方法中使用。 * 因為這種方法依賴于WMS(窗口管理服務的回調)。正是因為窗口回調機制,所以在Activity初始化時執行此方法得到的高度是0。 * 這個方法推薦在回調方法onWindowFocusChanged()中執行,才能得到預期結果。 */ public void getAppViewHeight(){ //屏幕 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); //應用區域 Rect outRect1 = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1); int statusBar = dm.heightPixels - outRect1.height(); //狀態欄高度=屏幕高度-應用區域高度 Log.e(TAG, "應用區高度:" + statusBar); }
setContentView 高度,view 顯示的高度
需要在見面創建后才能獲取到。
public static int getContentViewHeight(Activity activity) { Rect rectangle= new Rect(); activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rectangle); return rectangle.height(); }
標題欄高度
標題欄高度 = 應用區高度 - view 顯示高度
public static void getTitleBarHeight(Activity activity) { Rect outRect1 = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1); int viewTop = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //要用這種方法 int titleBarH = viewTop - outRect1.top; Log.e(TAG, "標題欄高度-計算:" + titleBarH); }
看完上述內容,你們掌握怎么在Android中獲取的屏幕的尺寸的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。