早期 Android 開發常用 Display.getWidth()/getHeight(),但此 API 自 API 13 起棄用,且在平板、多視窗、刘海螢幕等場景易回傳錯誤值。現代開發應根據 API 版本採用對應最佳實踐。
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
int realWidth = metrics.widthPixels;
int realHeight = metrics.heightPixels;
WindowMetricsCalculator calculator = WindowMetricsCalculator.getOrCreate();
WindowMetrics metrics = calculator.computeCurrentWindowMetrics(this);
int width = metrics.getBounds().width();
int height = metrics.getBounds().height();
| 錯誤寫法 | 問題 | 修正 |
|---|---|---|
| getWidth()/getHeight() | API 13 棄用,不含系統列 | 改用 getSize()/getRealMetrics() |
| 在 onCreate 立即查詢 | 視窗未佈局完成,可能為 0 | 延遲至 onWindowFocusChanged 或使用 ViewTreeObserver |
| 忽略多視窗/分割畫面 | 回傳全螢幕而非 App 實際可用區域 | 用 WindowMetrics 或 View.getWidth() |
View.getWidth()/getHeight() 或 ViewTreeObserver.OnGlobalLayoutListener 取得實際繪製尺寸。Display.getRealMetrics() 適用於相機預覽、全螢幕遊戲等場景。ScreenUtils 內部判斷版本號,對外提供統一 API。隨著裝置形態多元化,正確取得螢幕尺寸已非單一 API 可解決,需依據使用場景與目標 API 版本選擇適當方案。