溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Android中獲取的屏幕的尺寸

發(fā)布時間:2021-01-30 15:40:09 來源:億速云 閱讀:204 作者:Leah 欄目:移動開發(fā)

怎么在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;
  }

狀態(tài)欄高度

狀態(tài)欄就是屏幕頂部顯示時間,電池,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, "狀態(tài)欄高度-反射方式:" + statusBarHeight2);
  }

借助應用區(qū) top 屬性。

狀態(tài)欄位于屏幕的最頂端,坐標從 (0,0) 開始,所以應用區(qū)的頂部的位置就是狀態(tài)欄的高度。

  /**
   * 應用區(qū)的頂端位置即狀態(tài)欄的高度
   * *注意*該方法不能在初始化的時候用
   * */
  public void getStatusBarHeightByTop() {
    
    Rect rectangle = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
    Log.e(TAG, "狀態(tài)欄高度-應用區(qū)頂部:" + rectangle.top);
  }

應用區(qū)域高度

除去狀態(tài)欄剩下的都時應用區(qū)。由此可知屏幕的高度 - 狀態(tài)欄高度 = 應用區(qū)的高度。

/**
   * 不能在 onCreate 方法中使用。
   * 因為這種方法依賴于WMS(窗口管理服務的回調)。正是因為窗口回調機制,所以在Activity初始化時執(zhí)行此方法得到的高度是0。
   * 這個方法推薦在回調方法onWindowFocusChanged()中執(zhí)行,才能得到預期結果。
   */
  public void getAppViewHeight(){
    //屏幕
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    //應用區(qū)域
    Rect outRect1 = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
    int statusBar = dm.heightPixels - outRect1.height(); //狀態(tài)欄高度=屏幕高度-應用區(qū)域高度
    Log.e(TAG, "應用區(qū)高度:" + statusBar);
  }

setContentView 高度,view 顯示的高度

需要在見面創(chuàng)建后才能獲取到。

public static int getContentViewHeight(Activity activity) {
    Rect rectangle= new Rect();
    activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rectangle);
    return rectangle.height();
  }

標題欄高度

標題欄高度 = 應用區(qū)高度 - 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中獲取的屏幕的尺寸的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI