Android開發筆記(三)螢幕解析度
阿新 • • 發佈:2018-12-14
在app編碼中經常需要獲取手機的螢幕解析度(寬*高),原來我直接上網拷貝程式碼,但在使用過程中卻發現諸多不便。 不便一:下面程式碼中的getWidth和getHeight在adt上提示deprecated已經廢棄了,實在扎眼
WindowManager wm = getWindowManager();
Display display = wm.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
檢視android原始碼說可使用getSize替代,於是換成getSize並把程式碼提煉到工具類中
public static Point getSize(Activity act) {
Display display = act.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size); //size.x就是寬度,size.y就是高度
return size;
}
用了一陣發現又有不便,原因是getWindowManager方法只能在activity中使用或者被activity例項呼叫,那像我們在Fragment或者Adapter中想獲得螢幕解析度,又有困難了(因為Fragment和Adapter一般只有Context),雖然可以通過強制型別轉換來處理,可是畢竟勞民傷財需要時時記得去轉換。所以又改了從Context獲取系統服務,然後再去取解析度,改後的程式碼如下
public static Point getSize(Context ctx) {
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return size;
}
再後來發現通過DisplayMetrics也能獲取解析度,依網上的做法照貓畫虎如下:
public static Point getSizeNew(Context ctx) { WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(dm); Point size = new Point(); size.x = dm.widthPixels*dm.density; size.y = dm.heightPixels*dm.density; return size; }
不久便發現這個新方法時常量錯了,找來找去又自己反覆實踐,結果確認widthPixels和heightPixels就是寬和高,無需再乘上density。因為widthPixels和heightPixels的單位都是畫素,而density指的是畫素密度,即一個單位內有幾個畫素,所以在我這邊乘上density沒有意義,只有除以density才有意義。dm.widthPixels/dm.density指的是寬度上有多少單位,dm.heightPixels/dm.density指的是高度上有多少單位。網上乘以density的做法,可能只是他們恰好遇上部分特殊機型罷了。最後的程式碼如下:
public static Point getSizeNew(Context ctx) {
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
Point size = new Point();
size.x = dm.widthPixels;
size.y = dm.heightPixels;
return size;
}